RTT串口读怎么是分成2次读取完毕的?
串口进来的数据,每次都是分成2次才读取完毕? 第一次是1个字节,第二次是剩余的。用了很多样本测试过都这样,样本数据量不大,1K以内。是不是设计就是这样的?
RTT版本是GIT MASTER ,应该是1.2.0BETA ,uart1配置用的是默认的RX中断模式,TX STREAM。
部分关键代码:
// 串口的通知函数
static rt_err_t hub_rx_ind(rt_device_t dev, rt_size_t size)
{
struct rx_msg msg;
msg.dev = dev;
msg.size = size; //这个好像不准,已经读切完毕了还 >0
rt_mq_send(&rx_mq, &msg, sizeof(struct rx_msg));
return RT_EOK;
}
读取线程:
while (1)
{
/* wait receive */
result = rt_mq_recv(&rx_mq, &msg, sizeof(struct rx_msg), RT_WAITING_FOREVER);
if (result == RT_EOK)
{
rx_length = rt_device_read(msg.dev, 0, &rx_buffer, rx_length);
}
测试样板:
00aa: 这个2个字节的会先发送第一个00,然后aa
00aa00bbcc: 这个5个字节的会先发送第一个00,然后剩下的,但是上面的串口回调函数依然会被继续调用多次,尽管每次会读取不到什么, 也就是rx_length 为0
。
别的样板也是一样,都是第一次会先读取到一个字节,然后会通知读取剩余的字节,然后还会无效通知多次。
这样很不好控制了,一个完整的数据包给分成很多个,难道还的判断数据包头,组装数据包? 搞惯IP了原来串口的自己写协议,看来没有想象中那么容易用啊。
找到个参考的了。 同问,我用的是1.20正式版,也是RX中断模式。调了2天了。看finsh部分代码,是 看finsh部分代码,是while (rt_device_read(shell->device, 0, &ch, 1) == 1){……} finsh里接收字符串是接收一个消息、接收一个字符的。 楼主那个usart_frame.rar是裸机的。
页:
[1]