免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4241 | 回复: 1
打印 上一主题 下一主题

Linux C 跟单片机串口通信 16进制数据处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-23 00:23 |只看该作者 |倒序浏览
需要解决:
1 将字符串转成16进制发送的问题
2 将收到的16进制转成字符

假定通过串口的write向单片机发送如下16进制数据,write函数需要如何写
0xAA 0x8A 0x00 0x00 0xA1 0x04 0xFF 0xFF 0xFF 0xFF 0xA1 0x4A

单片机收到后,会返回
0xAA 0xA1 0xFF

0xAA 0xA2 0xFF

read函数該如何写呢?我需要根据收到的字节做不同的判断,再做不同的处理


最低级的想法是,当作字符串来处理的,但这应该是不行的,
/* write*/
char buffer[]="0xAA 0x8A 0x00 0x00 0xA1 0x04 0xFF 0xFF 0xFF 0xFF 0xA1 0x4A";
int        nwrite = write(fd,buffer,strlen(buffer));
printf("nwrite=%d\n",nwrite);


/*read*/
unsigned char buffer[15];
while(1){
          while((nread = read(fd,buffer,14))>0){ /*从串口读取16进制字节*/
                            buffer[nread]=0;
                printf("buffer is %s\n", buffer);
                        
          }
}
这个读,如果返回的是可打印字符是OK的,但如果不是可打印字符就成乱码了。
CU上看到有说用snprintf(buf, sizeof(buf), "%02X", (unsigned char)*p)
没理解
请教各位有经验的兄弟了

论坛徽章:
0
2 [报告]
发表于 2012-07-03 08:51 |只看该作者
/* write*/
char buffer[]="0xAA 0x8A 0x00 0x00 0xA1 0x04 0xFF 0xFF 0xFF 0xFF 0xA1 0x4A";
int        nwrite = write(fd,buffer,strlen(buffer));
printf("nwrite=%d\n",nwrite);

这里的strlen肯定不行,因为遇到0就结束了,不能使用strlen,直接使用你发送的数据的多少即可。

printf也是遇到0会结束,打印出来的东东必须是可打印字符即可看到,否则会出现乱码,而且没有打印完全
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP