单片机串口发送的数据一直是00;求解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机串口发送的数据一直是00;求解相关的知识,希望对你有一定的参考价值。

参考技术A 由于你说的不详细,也不知道你晶振是多少,单片机是什么型号,波特率是多少。也才不清楚你单片机串口的数据是否是一直有用的。我就大概说一下,你可以参考:
第一:如果串口的数据是在你需要的时候才有用,这样你可以在需要的地方打开串口中断,在中断中判断接收的是不是所用串口数据的最后一个字节,如果是那么就关闭中断,如果不是那么就就会继续接收。这样会提高串口和单片机的工作效率。
第二:如果串口数据是必须接收的,那么1楼和2楼所说的就不可以了,其实正常的处理中断就可以了,只要注意中断的优先级就好。串口处理占用的时间其实不是你想的那么多,我不防给你算一下:假设波特率是9600b/s,晶振8m,至于单片机什么类型就不去假设了,毕竟太多了。
串口数据8b一个字节,那么9600的波特率1s传播的次数也就是9600b/s/8b每次=1200次每秒,这个能理解吧。那么中断的时间间隔也就是1s/1200次每秒=0.83ms。再看单片机的处理速度,8m晶振(不算大吧),运行每条指令的时间基本上是1s/8m=0.125us,(就算是51单片机,处理周期是晶振周期的12倍,那每条指令的时间周期也不过是1点几微秒),通过数据你看,一次中断单片机能处理上千条指令,所以不会出现你想的它只是在接收数据,其他什么也许不干的情况。你所要做的就是如果有其他中断,处理好中断的优先级,哪些中断重要,需要优先处理之类的事情即可。
你不会存在误区吧,认为一直有数据,就一直在中断中吧,它接收是一个字节一个字节的。一个字节一中断。
楼上说的定时器你还是不要考虑了,需要多少次数不定,处理定时器中断后还要在处理串口,耽误的时间会更多。而且可靠性不高,串口一直传输数据的项目我做过,正常处理就不会出问题
参考技术B ……
TMOD|=0x20;
SCON=0x50;
TH0=0xfd;
//波特率9600--应该是TH1
TL0=0xfd;
--------应该是TL1
TR1=1;
ES=0;
---------
另外:
SBUF=read0832(0);--数据来自read0832()
而:
……
//读取结束
……
if(data1==data2)
//相等时
return(data2)
;//才返回值

那么,不相等时,函数返回的,是什么?
SBUF=read0832(0),你所发送的,究竟是什么?
参考技术C /*串口初始化*/
void
UART_int()

TMOD|=0x20;
SCON=0x50;
TH1=0xfd;
//这是TH1,你写成TH0啦
TL1=0xfd;//这是TL1
TR1=1;
ES=0;

/*定时中断*/这个中断程序顺序不对
void
T0_time()interrupt
1

TH0=(65536-500000)/256;
//放在第一条
TL0=(65536-500000)%256;
//
if(TI!=0)这都删掉,定时器中断怎么能判断TI呢?
//
//TI=0;
//delayms(50);
//
SBUF=read0832(0);
while(TI!=0);//用查询法发送
TI=0;

STM32单片机通过USART1接收到数据后,怎么把接收到的数据通过单片机的CAN口发送出去啊?

先编写usart1的接收程序,把接收到的数据存在数组里面,再编写can的发送程序,把数组的数据通过can发送出去,难点是usart的初始化,中断接收和can初始化,其实很简单的。先调好串口中断接收,再调试can发送。 参考技术A 这个可以把收到的数据保存在存储区域或数组中,然后通过CAN发送程序通过CAN端口发送出去。

以上是关于单片机串口发送的数据一直是00;求解的主要内容,如果未能解决你的问题,请参考以下文章

STM8S单片机串口UART2接收中断一直在运行,出不来,怎么回事?

单片机通过串口发送0x00,为啥串口接收后显示为80呢

STM8s003 串口发送数据后不再接收

PIC单片机串口接收进不了中断,发送正常

电脑串口接收不到单片机发过来的数据,但是单片机可以接收电脑串口数据...

单片机通过串口给控制器发送 16进制整数,控制灯带点亮