串口发送数据ascii和hex的区别

对于串口发送数据的一些理解
串口发送可以包含ascii发送和hex十六进制发送,不管采用哪种方式发送,计算机内部都是以二进制发送的,ascii发送会将你发送的ascii字符转换为对应的ascii码,0-127之间,然后将对应的ascii码以二进制方式在底层发送出去出;十六进制发送是直接将十六进制转换为二进制数据在底层发送出去。而对于接收端来说,如果发送方以十六进制发送,接收方需要以十六进制接收,发送方以ascii发送接收方则以ascii方式接收。

对于发送unsigned char buffer ={0xff,0x01};需要将数据准换为char*类型,而类型转换并不会对底层的二进制数据产生影响,例如0xff是一个int类型255 在底层是11111111,而转为char 类型后在底层依然是11111111,只是在数据类型表示层有了区别,unsigned char的255 表示255 ,而char的255表示-1。 数据类型的大小超出后会循环表示,而不是截断了。
所以对于发送{0xff,0x01}这种数据就是发送的二进制数据,底层是一样的,所以发送方和接收方的底层都是11111111 00000001。

io的输入输出函数 write和read 参数都是char或Qbytearray类型,发送的时候需要将unsigend char[] 类型转换为char,接收需要定义一个char*或Qbytearray数组,例如qt接收下位机发过来的{0xff,0x01}这样的二进制数组 接收后用.toHex()函数将其显示为十六进制, 如果接收的是文本字符串(ascii或utf8),接收的时候需要用QString::fromutf8()或者QString::fromloacal8bit()函数将Qbytearray进行转换,这个取决于发送方对于文本的编码方式不同而定。

### 串口通信中ASCII发送与Hex发送的区别 #### ASCII 发送 在串口通信中,当采用ASCII码进行数据传输时,每一个字符被转换成对应的7位或8位二进制数来表示。例如字母'A'对应于十进制数值65,在实际传输过程中会变成高电平低电平组成的序列[^1]。 对于编程实现来说,如果要通过串口发送字符串,则可以直接调用相应库函数并传入待发的文字内容;而接收端接收到的信息同样是以文本的形式呈现给用户查看。这种方式适合用于人机交互界面以及文件传输协议等场景下交换可读性强的内容。 ```cpp // C++示例:向串口写入ASCII字符串 std::string message = "Hello"; WriteFile(hSerial, message.c_str(), message.length(), &bytesWritten, NULL); ``` #### Hex 发送 相比之下,十六进制(hexadecimal)格式下的每一对数字代表了一个完整的字节(即八个比特),这使得它可以精确表达任意类型的二进制资料而不局限于特定编码集内的符号范围之内[^2]。因此,在某些情况下比如硬件调试或是控制指令传递方面更倾向于使用hex模式来进行更加底层的操作[^3]。 具体到程序设计上,开发者需要先将欲传送的数据按照两位一组拆分成若干部分,再逐个解析为相应的整型值之后才可通过API接口发出。而在另一侧监听到来自设备的消息后也要做相反方向上的变换以便正确理解所携带的意义。 ```cpp // C++示例:向串口写入十六进制字符串 void HexStringSend(HANDLE hSerial, const std::string& hex) { for (size_t i = 0; i < hex.length(); i += 2) { int byteValue; sscanf_s(hex.substr(i, 2).c_str(),"%x", &byteValue); // 将两个字符转化为一个字节 WriteFile(hSerial,&byteValue ,1,&written,NULL ); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值