打印
[MCU]

问一个 串口通信的问题 纠结了很久

[复制链接]
1927|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
asasasd|  楼主 | 2014-3-7 09:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
串口发送数据是一位一位发送的  接收数据也是一位一位接收的  除去起始位 和 停止位  就剩下了 8位 数据    当接收到8位数据后便申请中断  所以必须在下一个8位数据来之前取走这个数据  不然这个数据就会丢失   以上这些  是别人告诉我的   
(下面是我的理解)
但是 串口里面不是有一个叫  接收缓存寄存器  吗??单片机来不及  处理的  数据  不是可以存在  那里吗??  还有 如果 我通过  串口调试  助手  向单片机 发送yes  我的理解是  先发送 y   然后是e  最后是s  系统会分别将  这三个字母  拆分成8位数据+1个停止位+1个起始位  但是就会触发3次串口接收中断
还有人 告诉我  发送  yes  就是将 y e s  这三个字母  一起 打包成  8位数据+1个起始位+1个终止位
我现在很迷糊
我的  理解对不对啊??问了好几个人  查了一些关于串口的资料  但是还是不理解   求指教

相关帖子

沙发
wangch_sh| | 2014-3-7 10:22 | 只看该作者
你可以试验一下,看进了几次中断。设一个变量,在中断里加一,最后看这个变量是几。

使用特权

评论回复
板凳
handlike| | 2014-3-7 10:25 | 只看该作者
你的理解是正确的,别人告诉你的不正确。

使用特权

评论回复
地板
asasasd|  楼主 | 2014-3-7 10:59 | 只看该作者
handlike 发表于 2014-3-7 10:25
你的理解是正确的,别人告诉你的不正确。

那还好  。。。。嘿嘿   我想把收到的yes  存在一个数组里面  我现在还没有什么成型的思路   只是感觉应该 将这3个字符放在  一个数组里面  我的想法是将  接收缓存寄存器  中的  yes  通过一个for循环  来放到数组里面  可是  此时RBUF  里面已经有  3个字符了  我该怎么  为数组元素惊醒赋值啊??大侠  麻烦你帮我写一下这条鱼据吧   我也学习一下    跪谢啦~~

使用特权

评论回复
5
asasasd|  楼主 | 2014-3-7 11:04 | 只看该作者
wangch_sh 发表于 2014-3-7 10:22
你可以试验一下,看进了几次中断。设一个变量,在中断里加一,最后看这个变量是几。 ...

我去!!!我之所以有这种感叹  只能说明我还是一个菜鸟。。。。你的这种方法  小弟真是 闻所未闻  大侠  不妨  进一步指点  一下   顺便也让我学习一下你的这种方法   跪谢大侠了

使用特权

评论回复
6
浪子Tomorrow| | 2014-3-7 11:31 | 只看该作者
个人理解,单片机串口接收数据是一位一位的接收,
接收缓存寄存器8位的话,接收到八位数据后产生中断;
你说的“接收缓存寄存器”应该叫 接收缓存区,需要自己定义的,这样单片机来不及处理的数据可以存储在接收缓存区里面

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
asasasd + 1 赞一个!
7
coody| | 2014-3-7 13:46 | 只看该作者
看是什么单片机,只有一个缓冲的,在下一字节接收到之前,必须取走,否则被覆盖丢失。
如果有FIFO的,在FIFO溢出前必须取走,否则被覆盖丢失。

使用特权

评论回复
8
天风立马| | 2014-3-7 15:23 | 只看该作者
楼上说的对。溢出前取出,否则被覆盖。那个告诉你的人应该是玩上位机软件的,呵呵。

使用特权

评论回复
9
qzqstar| | 2014-3-7 22:08 | 只看该作者
串口接收最好用中断,通过一个缓冲区数组和标志位来与主程序交互,给你一个中断例程,stm32的,凑合着看吧。

void USART1_IRQHandler(void)
{
        char tmp;

        if(Usart1Cnt>30)
        {
                Usart1Ready = TRUE;
                return;
        }

        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
                /* Read one byte from the receive data register */
                tmp = USART_ReceiveData(USART1);
                if(tmp == '\n' || tmp == '\r')
                {
                        /* Received an Enter Key */
                        Usart1RxBuffer[Usart1Cnt++] = 0;
                        Usart1Ready = TRUE;
                        tmp = '\n';
                }else if( tmp == 0x08)
                {
                        /* Received a Backspace Key */
                        if(Usart1Cnt>0) Usart1RxBuffer[Usart1Cnt--] = 0;
                }else
                {
                        Usart1RxBuffer[Usart1Cnt++] = tmp;
                }

                /* Send the char back */
                USART_SendData(USART1, tmp);
        }
}

使用特权

评论回复
10
人民币的幻想| | 2014-3-8 08:27 | 只看该作者
要想验证到底是先发y再发e再发s还是一起发很简单,你直接发送对应的ascii码,看串口助手收到的是什么。:lol

使用特权

评论回复
11
PiaoLiuQ| | 2014-3-8 10:06 | 只看该作者
有机会看看FIFO。。。。有利于你提高。。。。。至于想存在数组只需要在中断中处理就可以。。。。

使用特权

评论回复
12
winclpt| | 2014-3-9 16:21 | 只看该作者
楼主理解的是好的

使用特权

评论回复
13
受不了了| | 2014-3-9 18:55 | 只看该作者
设计单片机的英特尔多聪明的,几十年前就给你考虑到这些问题了:lol

使用特权

评论回复
14
czq624589971| | 2014-3-9 23:24 | 只看该作者
楼主说的是对的

使用特权

评论回复
15
xlsbz| | 2014-3-12 08:27 | 只看该作者
能看出来  楼主学习好认真啊  

物理机构是
----数据缓冲器------移位寄存器------

数据缓冲器51一般是8位,别的单片机说不准更多字节
移位寄存器都是8位
“必须在下一个8位数据来之前取走这个数据  不然这个数据就会丢失”?这个有的是新值,有的是老值。不同芯片不一样一样。

发送是一个一个字节发  接收是一个一个字节接收,51接收一个字节产生一个中断。
但是有的 比如STM32的DMA模式  是接收一串数 产生一个中断。

楼主可以这样学,用KEIL的软仿真器来模拟。保证你学的透透。别人告诉的  书上写的都不一定靠得住。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

67

帖子

0

粉丝