串口发送数据——字符串发送与十六进制发送的区别

我们在用串口发送数据的时候首先将待发送的数据/符号转换为对应的ASCII码,然后将这些ASCII码按照二进制的方式一位一位地发送出去。

(注:以下图片来自https://blog.csdn.net/wityy/article/details/8234739

字母、数字在内存中的二进制应该按照ASCII码表对照,也就是A的ASCII码是65,十六进制是0x41,二进制内存为01000001

(内存中存的是二进制数,这8位二进制数对应的是ASC码的十进制数,上面说的十六进制0x41是中间的一个转换,没什么实际用处,它既不是内存里实际存储的可以看到的东西,也不是ASCII表里的东西)

也有博友说:“A852010100000000A91A”指的是十六进制的0~F组成的数据串,并不是指的字符串。在编程实现中,这个数据串存储在string中是需要先转化下的: [引用自 http://blog.csdn.net/xhao014/article/details/6663738 请谅解源码作者已经无从考证]

 

### 使用 STM32F103C8T6 单片机的 UART 接口发送十六进制数据 为了使 STM32F103C8T6 单片机能通过其 UART 串口接口以十六进制格式向 SU03TT 设备发送数据,需配置 UART 外设并编写相应的程序来处理数据传输。 #### 配置硬件连接 确保 STM32F103C8T6 的 TXD (通常为 PA9 或其他映射引脚) 连接到 SU03TT 的 RXD 输入端子上。同样地, 如果需要接收来自 SU03TT 的响应,则应将 STM32 的 RXD 引脚(通常是 PA10) SU03TT 的 TXD 输出相接[^1]。 #### 初始化 UART 设置 在软件层面初始化 UART 参数之前,先要设置系统的时钟源以及波特率等参数。下面是一个简单的初始化函数示例: ```c void USART_Init(void){ // 启用 GPIOA 和 USART1 的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); // 配置USART1_TX(PA.09)引脚: 复用推挽输出极性最大速度50MHz GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置 USART1 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); // 开启 USART1 USART_Cmd(USART1, ENABLE); } ``` 此代码片段展示了如何启用必要的外设时钟、配置用于通信的 GPIO 引脚,并设定基本的 UART 属性如波特率为 `115200` bps,无校验位,一位停止位等。 #### 发送十六进制数据 当准备就绪后,就可以定义一个函数用来发送特定的字节序列给目标设备。这里提供了一个简单的方法来转换整数成对应的 ASCII 表示形式以便于显示或调试目的;然而,在实际应用中可以直接传递原始字节数组作为命令帧的一部分。 ```c #include "stdio.h" void SendHexData(uint8_t *pData, uint16_t length){ for(int i=0;i<length;i++){ printf("%02X ", pData[i]); // 打印每两个字符表示的一个字节 while (!(USART_GetFlagStatus(USART1, USART_FLAG_TC))); // 等待完成前一次传送 USART_SendData(USART1, pData[i]); } } int main(){ uint8_t hex_data[] = {0xAA, 0xBB, 0xCC}; // 要发送的数据包 SendHexData(hex_data,sizeof(hex_data)); while(1){}; return 0; } ``` 上述 C 语言代码实现了通过 UART 将指定数组中的每一个元素按照十六进制格式打印出来并通过串行线发送出去的功能。注意这里的 `printf()` 函数仅用于说明用途,并不是真正有效的实现方式——它依赖于标准库支持并且可能不适合嵌入式环境下的最终产品版本。对于生产环境中应当移除此类辅助性的输出语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值