新手上路
- 积分
- 37
- 金钱
- 37
- 注册时间
- 2020-2-2
- 在线时间
- 6 小时
|
1金钱
基于正点原子的串口通信例程,我做了一个测试,串口接收一串16进制的数据(其实就是modbus协议的问询帧),然后在串口里解析数据,并通过串口发出对应的数据。但是出现了异常,串口发出来的会在我发送的数据前面增加0X0A。
不知道是什么原因,求助~
相关代码如下
int main(void)
{
uint8_t t;
uint8_t len;
uint16_t times = 0;
sys_stm32_clock_init(9); /* 设置时钟, 72Mhz */
delay_init(72); /* 延时初始化 */
usart_init(72, 9600); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
while (1)
{
if (g_usart_rx_sta & 0x8000) /* 接收到了数据? */
{
len = g_usart_rx_sta & 0x3fff; /* 得到此次接收到的数据长度 */
// printf("\r\n您发送的消息为:\r\n");
memcpy(ModVars.rxbuf, g_usart_rx_buf, len);
if (len > 0)
{
Modbus_process();
}
// printf("\r\n%X\r\n",g_usart_rx_buf[0]); /* 插入换行 */
// for (t = 0; t < len ; t++)
// {
// USART_UX->DR = g_usart_rx_buf[t];
// while ((USART_UX->SR & 0X40) == 0); /* 等待发送结束 */
// }
// for (t = 0; t < len ; t++)
// {
// USART_UX->DR = ModVars.rxbuf[t];
// while ((USART_UX->SR & 0X40) == 0); /* 等待发送结束 */
// }
// for (t = 0; t < ModVars.length ; t++)
// {
// printf("%x",ModVars.txbuf[0]);
// }
for (t = 0; t < ModVars.length ; t++)
{
USART_UX->DR = ModVars.txbuf[t];
while ((USART_UX->SR & 0X40) == 0); /* 等待发送结束 */
}
g_usart_rx_sta = 0;
}
else
{
times++;
if (times % 5000 == 0)
{
printf("\r\n正点原子 STM32开发板 串口实验\r\n");
printf("正点原子@ALIENTEK\r\n\r\n\r\n");
}
// if (times % 200 == 0) printf("请输入数据,以回车键结束\r\n");
if (times % 30 == 0) LED0_TOGGLE(); /* 闪烁LED,提示系统正在运行. */
delay_ms(10);
}
}
}
注释掉的部分是用于排查问题的,我把接收到的数据,和要发送的数据的buf都打印出来看过了,没问题,而且根据CRC显示,计算的也没问题,证明收到的数据是正常的,也能正常解析,但是不知道为什么发出去的就会多一个0x0A。
去掉0x0A,后面的数据部分也是正常的,CRC计算值都没问题。
|
|