使用了MSComm控件。
在OnInitDialog中:
m_Com.SetCommPort(1); //选择COM1
m_Com.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
m_Com.SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes if(!m_Com.GetPortOpen()) //打开串口
m_Com.SetPortOpen(TRUE);
m_Com.SetInputMode(1); //设置输入方式为二进制方式
m_Com.SetSettings("9600,n,8,1"); //设置波特率等参数
m_Com.SetRThreshold(1); //为1表示有一个字符引发一个事件
m_Com.SetInputLen(0);
接收代码如下:
void CMyDlg::OnCommMscomm()
{
VARIANT vResponse;
char *str;
char *str1;
int k, nEvent, i;
nEvent = m_Com.GetCommEvent(); switch(nEvent)
{
case 2:
k = m_Com.GetInBufferCount(); //接收到的字符数目
//为什么k总是不能大于8 ***
m_K = k; if(k > 0)
{
vResponse=m_Com.GetInput(); //read
//对数据进行其他处理
str = (char*)(unsigned char*) vResponse.parray->pvData;
}
// 接收到字符,MSComm控件发送事件
i = 0;
str1 = str;
while (i < k)
{
i++;
str1++;
}
*str1 = '\0';
m_strReceive = (const char *)str;
//清除字符串中的不必要字符
break;
} UpdateData(FALSE);
}***处为什么k总是不能大于8?比如我发送abcdefghi时,k为1,也只显示收到i?用串口调试助手发送的字符串应该没错,可是接收处代码哪错了?
在OnInitDialog中:
m_Com.SetCommPort(1); //选择COM1
m_Com.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
m_Com.SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes if(!m_Com.GetPortOpen()) //打开串口
m_Com.SetPortOpen(TRUE);
m_Com.SetInputMode(1); //设置输入方式为二进制方式
m_Com.SetSettings("9600,n,8,1"); //设置波特率等参数
m_Com.SetRThreshold(1); //为1表示有一个字符引发一个事件
m_Com.SetInputLen(0);
接收代码如下:
void CMyDlg::OnCommMscomm()
{
VARIANT vResponse;
char *str;
char *str1;
int k, nEvent, i;
nEvent = m_Com.GetCommEvent(); switch(nEvent)
{
case 2:
k = m_Com.GetInBufferCount(); //接收到的字符数目
//为什么k总是不能大于8 ***
m_K = k; if(k > 0)
{
vResponse=m_Com.GetInput(); //read
//对数据进行其他处理
str = (char*)(unsigned char*) vResponse.parray->pvData;
}
// 接收到字符,MSComm控件发送事件
i = 0;
str1 = str;
while (i < k)
{
i++;
str1++;
}
*str1 = '\0';
m_strReceive = (const char *)str;
//清除字符串中的不必要字符
break;
} UpdateData(FALSE);
}***处为什么k总是不能大于8?比如我发送abcdefghi时,k为1,也只显示收到i?用串口调试助手发送的字符串应该没错,可是接收处代码哪错了?
解决方案 »
- 菜鸟诚恳请教dll消息拦截问题
- VS2008属性页里添加消息函数,为什么经常出现一片空白?
- mysql 库连接出错问题。
- <<<---->>>除了 WS_EX_TOOLWINDOW 外,还有那些方法使 窗口标题 不在 任务栏 里 显示按钮 ?
- DirectX[sdk 中DirectPlay带voice交互的例子播放后声音效果不好,什么原因?如何解决?]
- 需要做个功能,mp3压缩的,有经验的请赐教
- [求助]vc怎样才能处理raw(potoshop)格式的图片?
- 怎样调用DLL啊?(动态调用)
- windows2000服务怎样与前台程序通讯?
- MFC Extension Dll入门级问题(loyee()&mousubin(无情剑客16155843)来领分)
- 高分求助:大量数据列表显示
- 怎样在对话框初始化时让编辑框内的字符呈现被选中状态呢?
recvBuf.Empty();
....
if(k > 0)
{
vResponse=m_Com.GetInput(); //read
//对数据进行其他处理
str = (char*)(unsigned char*) vResponse.parray->pvData;
recvBuf+=str;
......
} recvBuf就是接收到的字符
m_Com.SetRThreshold(1); //为1表示有一个字符引发一个事件
VARIANT vResponse;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
int nEvent;
nEvent = m_Com.GetCommEvent();
switch(nEvent)
{
case 2: //事件值为2表示接收缓冲区内有字符
{
vResponse=m_Com.GetInput(); //read
safearray_inp=vResponse; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
m_K=len;
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
recvBuf+=strtemp; //加入接收编辑框对应字符串
}
}
m_strReceive = recvBuf;