消息关闭
    暂无新消息!

c语言写串口数据0a变成0d 0a问题

问题作者 : 黑人2017-07-14发布
问题描述:
PortWrite:02 0A 50 00 00 00 00 00 00 00 00 00 00 03
PortRead:接收数据超时
经PC端调试工具调试发现接受到的数据为:02 0D 0A 50 00 00 00 00 00 00 00 00 00 00 03。故ICT板没响应(接收数据与预期不符),而终端发送数据与预期一致(aucSend,aucSend1为写入数据)。
该现象为偶现。有时候调试1天也没有出现该问题。
以下为定位该问题
源码如下:(PortWrite这类函数已封装好,用了几十年。基本可以排除底层问题)
int SP80_ICT_Commu(int nLevel)
{
char  aucRead[20] = {0}, aucSend[20] = {0}, aucSend1[20] = {0};
int nLen = 0,nRet = 0, nErrFlag = 0;

//SP80与ICT通讯指令
tICTStatus.acStatus50[0] = 0x50;
memcpy(aucSend1,"\x02\x0A\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03",14);
//发送数据
memcpy(aucSend,"\x02\x0A",2);
memcpy(aucSend+2,tICTStatus.acStatus50,10);//tICTStatus.acStatus50:50 01 00 00 00 00 00 00 00 00 00 
memcpy(aucSend+12,"\x00\x03",2);

SP80_ICT_COMMUM:
if((nRet = PortClrBuf(PORT_NUM_COM1)) != NDK_OK) /*清接收缓冲*/
{
cls_show_msg("line %d,nRet=%d", __LINE__, nRet);
return NDK_ERR;
}
if((nRet = PortWrite(PORT_NUM_COM1, 14, (nLevel == 1) ? aucSend : aucSend1)) != NDK_OK) /*往串口发送测试数据*/
{
cls_show_msg("line %d,nRet=%d", __LINE__, nRet);
return NDK_ERR;
}
//接收数据,2秒超时
if(((nRet = PortRead(PORT_NUM_COM1, 14, aucRead, 10*1000,&nLen)) != NDK_OK) || (nLen != 14))
{
cls_show_msg("line %d,(ret=%d)(实际%d, 预期%d)", __LINE__, nRet, nLen, 14);
cls_show_msg("nLevel = %d\n"
    "aucSend=%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n"
    "aucSend1=%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n"
    "acStatus50=%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
nLevel, aucSend[0],aucSend[1],aucSend[2],aucSend[3],aucSend[4],aucSend[5],aucSend[6],aucSend[7],aucSend[8],aucSend[9],aucSend[10],aucSend[11],aucSend[12],aucSend[13],
aucSend1[0],aucSend1[1],aucSend1[2],aucSend1[3],aucSend1[4],aucSend1[5],aucSend1[6],aucSend1[7],aucSend1[8],aucSend1[9],aucSend1[10],aucSend1[11],aucSend1[12],aucSend1[13],
tICTStatus.acStatus50[0],tICTStatus.acStatus50[1],tICTStatus.acStatus50[2],tICTStatus.acStatus50[3],tICTStatus.acStatus50[4],tICTStatus.acStatus50[5],tICTStatus.acStatus50[6],tICTStatus.acStatus50[7],tICTStatus.acStatus50[8],tICTStatus.acStatus50[9]);
goto SP80_ICT_COMMUM;
return NDK_ERR;
}
return NDK_OK;
}
求指教,感激不尽!!!

9个回答

︿ 3
不要把
fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
︿ 0
串口读写问题跟fopen,open有关系吗??

POS和PC通信的时候,开个串口监控软件,监控一下就可以看到到底是哪边出的问题。

如果监控软件看到POS上发的数据是对的,那就是PC出现的问题。
如果监控软件看到POS上发的数据是不对的,那就是POS出现的问题。
︿ 0
PC端看见数据0a变成0d0a,这个怎么看见的?用串口调试工具?还是自己处理了,相信POS数据是正确的,是PC处理问题
︿ 0
\n  在windows上变成  \r\n , 在Linux下还是 \r ,在macOS 上编程 \n 
因为C语言只是说\n是换行,并没有说\n一定是 0A,然后不同系统对换行概念定义不一致
︿ 0
打开串口是怎么打开的,打开以后数据接收到你从哪里看到数据0A变成0D0A的(是写了日志吗)?
︿ 0
又碰到一个,是C函数库问题,你用fopen,open等函数的之后指定b、_O_BINARY 操作不就没事了