查看: 2703|回复: 10

[其他] 一种使用串口的新方式

[复制链接]

该用户从未签到

9

主题

219

帖子

0

高级会员

Rank: 4

积分
653
最后登录
2017-11-19
发表于 2015-4-24 17:54:16 | 显示全部楼层 |阅读模式
只是简单的介绍一下串口的发送与接收:

在初学的时候,对串口的使用只是在该需要发送的时候发送,在需要接收的时候接收。比如我发送一个字符串“Hello world!”只是通过while循环,简单的将字符串分别发出去。如果你使用的时单任务(从main一直执行下去)的话,这样是不会出什么问题的,但是如果你使用OS,有两个任务同时使用串口,比如:
void TaskOne(void)
{
    Serial.write("Hello world!");
    Thread.sleep(10); //about 10ms
}

void TaskTwo(void)
{
    Serial.write("From xxxOS!");
    Thread.sleep(10);
}

像这样的代码,可能在TaskOne发送了Hello之后被OS挂起,继而进行TaskTwo,像这样的话,你的接受端收到的信息可能就是Hello From xxxOS ! world!或者更糟。

为了有效的解决这样的问题,我们应该为USART建立缓冲区,当需要发送的时候,首先将数据写到缓冲区,再在合适的时间将缓冲区的数据发送出去(flush)。并且需要保证写缓冲区和发送的操作时不可打断的(可以使用信号量来控制)。当然,如果你说我不建立缓冲区,直接使用信号量来保证发送不可中断可以吗?当然可以。不过发送看不出缓冲区的优势。可以看看接收的过程。


在我刚开始学习的时候,往往意识不到缓冲区的优势。比如我需要接收一个字符,我就会一直等待,直到USART接受到了字符。
if(usart_rx_empty()) while(1);
read_rx_data();
但是这样也是有一个弊端的。比如在10:00的时候USART接受到了一串指令,可能是“ls -l”,但是我的程序需要在10:01的时候从USART中读取一串字符,这样我会一直等待新的字符到来,而忽略了之前接收到的。

为了解决这个问题。我们可以建立一个缓冲区,打开USART的接受中断。在接受中断发生的时候,将数据存放在缓冲区中。这样就不会丢掉任何一个需要的字符了。




我知道答案 目前已有10人回答
回复

使用道具 举报

  • TA的每日心情
    开心
    2017-1-4 14:54
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    5

    主题

    130

    帖子

    0

    高级会员

    Rank: 4

    积分
    585
    最后登录
    2017-2-11
    发表于 2015-4-24 19:26:37 | 显示全部楼层
    学习一下
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-12-10 16:14
  • 签到天数: 1442 天

    连续签到: 1 天

    [LV.10]以坛为家III

    17

    主题

    3862

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    8291
    最后登录
    2021-12-10
    发表于 2015-4-24 19:55:14 | 显示全部楼层
    楼主的经验谈,学习了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    27

    主题

    157

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    465
    最后登录
    2015-6-20
    发表于 2015-4-24 21:30:36 | 显示全部楼层
    涨姿势乐。。。。
    回复

    使用道具 举报

    该用户从未签到

    31

    主题

    253

    帖子

    20

    金牌会员

    Rank: 6Rank: 6

    积分
    1548
    最后登录
    2021-7-20
    发表于 2015-4-24 22:14:40 | 显示全部楼层
    OS 学习一下,一直裸奔的走过。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11

    主题

    251

    帖子

    0

    高级会员

    Rank: 4

    积分
    690
    最后登录
    2016-11-3
    发表于 2015-4-24 22:30:25 | 显示全部楼层
    存起来学习一下,感谢楼主的分享
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    59

    帖子

    0

    注册会员

    Rank: 2

    积分
    182
    最后登录
    2015-6-17
    发表于 2015-4-25 18:25:55 | 显示全部楼层
    信号量确实是让任务占有某个资源,如果接收用到中断的话,其实还可以用消息队列传递uart接受到的数据,不过这个和缓冲区就差不多了,但是它是OS自带的服务了!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    91

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    267
    最后登录
    2015-10-23
    发表于 2015-4-26 11:58:18 | 显示全部楼层
    感谢楼主分享!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    24

    主题

    410

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1203
    最后登录
    2018-6-27
    发表于 2015-4-26 22:45:39 | 显示全部楼层
    这不错,学习下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-5-7 09:07
  • 签到天数: 353 天

    连续签到: 1 天

    [LV.8]以坛为家I

    141

    主题

    8056

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5788
    最后登录
    2025-5-7
    发表于 2015-4-27 15:47:39 | 显示全部楼层
    学习一下
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-12 15:29 , Processed in 0.108102 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表