串口数据的格式问题
来源:互联网 发布:java面向对象易错题 编辑:程序博客网 时间:2024/06/06 21:05
串口数据的格式问题
工作中有需求是将串口回传的数据给上位机,处理完之后再回传给板子.上位机是用MFC来做的.收到的数据需要转换成16进制数在上位机处理过后,再转换为ascii码回传.由于程序原先代码的串口发送函数接收的参数是CString类型的,我处理的数据需要是char类型的.这就涉及到进制转换的问题:
板子传给上位机
假如我想要的数据是0xcc,串口回传的数据打印在屏幕上的是CC.转换成ascii码就是0x43,0x43.
这里就有2个问题啦:
1.本来我要的是一个字节的数据,但是却给了我两个字节
2.我要的是原本的数据,但是却给了我ascii码
上位机传给板子
这个和上面的问题是相反的关系:1.假如我向板子写了个 'DD',我的本意是希望板子收到0xdd,即一个字节的数据.但实际情况是板子收到'D'和'D'两个字节.2.收到的这两个字节还不是0x0d和0xd,而是0x44和0x44
CString 是MFC提供给我们的一个类.char是一个基本的数据类型,它们之间是可以转换的.
假设char * test = “hello world”,想转换成CString类对象的话只需要CString str(test);然后通过串口丢出去就好了.
有一个小插曲.像上面那种转换的话当char * 里面的含有0x00(不是在字符串末尾) 这样的数据,CString就是自动截断输出了,即如下图所示,CString打印出来的可能就是”A”了.解决的办法是在CString构造的时候手动 指定长度,即CString str(test,3).如果是char数组的话也可以是sizeof(test),但是不要用strlen,它也是根据’\0’来判断字符串借宿的
回到上面的问题:串口现在传给我了”12ABCDEF”,一共是 8个字节.我想要应该是0x12,0xAB,0xCD,0xEF.下面就要开始进行转换
char halfToHex(BYTE data){ if((data>='0') && (data<='9')) return data-0x30; else if ( (data>='A') && (data <='F')) return data-'A'+10; else if ( (data >='a') && (data <='f')) return data-'a'+10; else return -1; } int CharToHex(char * ks_str , char * ks_hex,unsigned int key_length){ unsigned int i=0; int index = 0; char ret; char tmpData=0x00; for(;i<key_length;i++){ tmpData = ks_str[index++]; ret = halfToHex(tmpData)<<4 ; tmpData = ks_str[index++]; ret = ret + halfToHex(tmpData); ks_hex[i] = ret; } return 0; }
上位机处理完数据之后需要再转换为ascii码回传给板子:
char transform(unsigned char k){ if( (k>= 0x0a) && (k<=0x0f)) return (k+ 0x37); else if ( (k>= 0x00) && (k<=0x09)) return (k+0x30); }int HexToChar(unsigned char * input, char * output,int length){ int count =0; unsigned char tempData_low; unsigned char tempData_high; for(;count<length;count++){ tempData_low = (input[count] & 0xF); output[count*2] = transform(tempData_low); tempData_high = ((input[count]>>4) & 0xF) ; output[2*count+1] = transform(tempData_high); } return 0;}
这样,数据就能准备的处理和传递啦
0 0
- 串口数据的格式问题
- 51串口发送数据的格式
- 通过串口配置GSP NMEA 数据的输出格式
- 串口通信数据丢失的问题
- 串口数据获取-时间间隔的问题
- 关于串口发送数据的问题
- QserialPort 串口数据发送的问题
- 串口数据收发问题
- 数据的格式和验证问题
- 节点数据打印的格式控制问题
- excel导入数据的时间格式问题
- 串口收发数据时候的高低位问题
- dm355的串口问题,uart1发不了数据
- 解决“串口接收数据时被截断”的问题
- C# 串口通讯的数据丢失和同步异步问题
- qt5.0串口写数据返回为-1的问题
- 安卓 串口读取数据遇到的问题
- MTK 解决蓝牙串口MMI不能收发数据的问题
- HDU 3555 Bomb
- 正在进行简易安装时 无法手动启动 vmware tools 安装 的解决方法
- 8.2 Dictionary类
- storm单机安装
- 3Sum_Leetcode_#15
- 串口数据的格式问题
- 长瘦管道的MSS对TCP性能的影响
- hdfs 文件权限设计
- Python利用朴素贝叶斯进行评分的分类
- Find them, Catch them--POJ 1703带权并查集
- Hdu 5456 Matches Puzzle Game (记忆化搜索) 2015 ACM-ICPC沈阳网赛
- linux各文件夹的作用
- Android NDK 开发
- Ubuntu自动获取IP地址的相关操作/方法