win32 串口通信接收数据异常

傻嘚小青年 2018-04-27 04:37:20
在使用win32进行串口通信编程时,发送数据可以成功,但是接收数据发现数据错乱。
发送方发送的数据为:(16进制)11 11 11 11 22 22 22 22 33 33 33 44
接收方收到的数据为:

发送是通过串口调试助手做的:

接收方代码如下:

typedef struct NormalCommand
{
unsigned char szDataBuffer[MAX_LEN];
int dataLen;

NormalCommand()
{
memset(szDataBuffer, 0, MAX_LEN);
dataLen = 0;
}

}struNormalCommad;

int ReadNormalAnswer(HANDLE Handle, struNormalCommad* commandTmp)
{
if (Handle == INVALID_HANDLE_VALUE)
{
return FALSE;
}

DWORD realRecvLen = 0;
DWORD curLen = 0;
BOOL ret = FALSE;

DWORD Error;
COMSTAT cs = { 0 };

while (1)
{
ClearCommError(Handle, &Error, &cs);

//MAX_HEAD_LEN 13 内部约定的数据包头长度。
ret = ReadFile(Handle, commandTmp->szDataBuffer + curLen, MAX_HEAD_LEN, &realRecvLen, NULL);
if (ret != FALSE)
{
if (realRecvLen == 0)
{
PurgeComm(Handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
return FALSE;
}
curLen += realRecvLen;
commandTmp->dataLen += realRecvLen;

int leftLen = AnalyzeDataLen(commandTmp);
if (leftLen > 0)
{
ClearCommError(Handle, &Error, &cs);

ret = ReadFile(Handle, commandTmp->szDataBuffer + curLen, leftLen, &realRecvLen, NULL);
if (ret != FALSE)
{
if (realRecvLen == 0)
{
PurgeComm(Handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
return FALSE;
}
curLen += realRecvLen;
commandTmp->dataLen += realRecvLen;
return TRUE;
}
}
else
{
return TRUE;
}
}
}

return TRUE;
}
...全文
645 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-04-28
  • 打赏
  • 举报
回复
仅供调用:
void HexDump(char *buf,int len,int addr) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%08x -",i+addr);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}
白色一大坨 2018-04-28
  • 打赏
  • 举报
回复
最高位没接收到,0xFA变成了0x7A,以目前状况来看,我比较怀疑你初始化时候,串口的几个参数与调试工具是否一致; 波特率,校验位,数据位,停止位,这里要跟你的串口助手一致,请查看一下; 你之前帖子里说你波特率调的9600,但你截图工具用的115200,请一定确认一下串口参数,如果参数对不上,数据传输是会出现问题的。
qq_36260408 2018-04-28
  • 打赏
  • 举报
回复
加个断点调试下
傻嘚小青年 2018-04-28
  • 打赏
  • 举报
回复
引用 9 楼 hou09tian 的回复:
我觉得可以换个串口助手试试,以前遇到过这种情况。
能否推荐一个?谢谢
棉猴 2018-04-28
  • 打赏
  • 举报
回复
我觉得可以换个串口助手试试,以前遇到过这种情况。
傻嘚小青年 2018-04-28
  • 打赏
  • 举报
回复
引用 7 楼 phenix2009 的回复:
不能看后面那个,前面的才是收到的数据吧


我发送的数据为:70 15 03 00 00 00 00 02 00 00 70 FA 0A
收到的为:

倒数第二个字节也不对啊,FA应该是250,收到的为什么是122呢
傻嘚小青年 2018-04-28
  • 打赏
  • 举报
回复
引用 12 楼 phenix2009 的回复:
最高位没接收到,0xFA变成了0x7A,以目前状况来看,我比较怀疑你初始化时候,串口的几个参数与调试工具是否一致; 波特率,校验位,数据位,停止位,这里要跟你的串口助手一致,请查看一下; 你之前帖子里说你波特率调的9600,但你截图工具用的115200,请一定确认一下串口参数,如果参数对不上,数据传输是会出现问题的。
果然是因为这个导致的,谢谢大神指点。
白色一大坨 2018-04-27
  • 打赏
  • 举报
回复
不能看后面那个,前面的才是收到的数据吧
白色一大坨 2018-04-27
  • 打赏
  • 举报
回复
收到的是17 17 17 17 34 34 34 34 51 51 51 68 请全部转换成16进制,不就是0x11 0x11 0x11 0x11 0x22 0x22 0x22 0x22 0x33 0x33 0x33 0x44
傻嘚小青年 2018-04-27
  • 打赏
  • 举报
回复
引用 4 楼 phenix2009 的回复:
请问接收数据错乱是指什么,我看接收的数据的确是你发送的,是不是你把16进制和10进制看混了? 还是说下面那俩0是多发了?
我发送的是16进制:11 11 11 11 22 22 22 22 33 33 33 44 收到的是 \x11 \x11 \x11 \x11 \‘’ \" \" \" 3 3 3 3 收到的也对不上啊?
傻嘚小青年 2018-04-27
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
波特率设置低一点,串口线短一点。
波特率9600,没有串口线,用的串口调试工具,虚拟的串口
白色一大坨 2018-04-27
  • 打赏
  • 举报
回复
请问接收数据错乱是指什么,我看接收的数据的确是你发送的,是不是你把16进制和10进制看混了? 还是说下面那俩0是多发了?
赵4老师 2018-04-27
  • 打赏
  • 举报
回复
波特率设置低一点,串口线短一点。
赵4老师 2018-04-27
  • 打赏
  • 举报
回复
想办法换实际的串口。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧