读书人

mscomm串口有关问题

发布时间: 2012-03-09 16:54:58 作者: rapoo

十万火急,mscomm串口问题
m_ctrMSCom.SetCommPort(m_port + 1);//设置串口号
CString strParam="9600,N,8,1";//定义通信参数变量
m_ctrMSCom.SetSettings(strParam);//设置串口通信参数
m_ctrMSCom.SetOutBufferSize(1024);//设置发送缓冲区大小为512字节
m_ctrMSCom.SetInBufferSize(1024);//设置接收缓冲区大小为1024字节
m_ctrMSCom.SetInBufferCount(0);//清空接收缓冲区
m_ctrMSCom.SetInputMode(1);//设置串口数据读取方式为二进制
m_ctrMSCom.SetInputLen(0);//设置读取接收缓冲区中的所有数据
m_ctrMSCom.SetRThreshold(1);//设置接收缓冲区中有1个字符时响应OnComm事件

现在下位机发送的unsigned char类型的、是10的倍数的数据,然后我接收数据程序是这样的:
VARIANT m_input;
WORD *WVar;//2个字节
m_input=m_ctrMSCom.GetInput();//读取缓冲区内的数据
WVar=(WORD*)m_input.parray->pvData;
if((5<=*WVar) &&(*WVar<=255)&&(*WVar%10==0))
{
_itoa((int)(*WVar),str2,10);
m_stepTH.AddString(str2);
}
现在调试能接收到数据,但是数据的格式不对,就是不是10的倍数,各位帮忙看看吧,他们等着做实验用,急,谢谢了!

[解决办法]
WORD换成unsigned char 试试。
下位机发的也是unsigned char的数据,也就不存在大于这个范围,没必要定义为WORD。
if ((5 <= data) && (data % 10 == 0))
[解决办法]
1 你用messagebox把刚收到的*wvar打出来看看,先暂时不要itoa
2 检查发送方是不是对的。
3 看看是不是移位了?位子没对上之类的。应该不太可能。因为windows都封装了
[解决办法]
换成unsigned char就收不到数据了?


这是用MSComm通讯接收区的例子,看下,按你的要求自己改。

C/C++ code
void CSCommTestDlg::OnComm() {    // TODO: Add your control notification handler code here    VARIANT variant_inp;    COleSafeArray safearray_inp;    LONG len,k;    BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.    CString strtemp;    if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符    {             ////////以下你可以根据自己的通信协议加入处理代码        variant_inp=m_ctrlComm.GetInput(); //读缓冲区        safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量        len=safearray_inp.GetOneDimSize(); //得到有效数据长度        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存放            m_strRXData+=strtemp; //加入接收编辑框对应字符串         }    }    UpdateData(FALSE); //更新编辑框内容} 

读书人网 >C++

热点推荐