导航:首页 > 操作系统 > 单片机串口接收多字节

单片机串口接收多字节

发布时间:2022-10-09 18:34:27

1. 请问51单片机如何解决多字节串口接收问题

串口的收发可以用查询和中断两个办法来实现。
1、查询方法更适合于半双工机制,编写的思路简单,程序结构简单,在全双工通信中易出问题。
2、中断方法则更高效。你的程序把两种方法混搭使用,容易出错。

以你的程序为例,一旦收到首个23H字符,就停止在中断服务中for循环里面等待5个剩余字符。假设传感器只发了3个字符,你的程序就停止在for循环里面。
以你的程序为例改进,在中断服务接收中,每次接收中断只收1个字符,完成后退出。
void uart_interrupt(void) interrupt 4 using 0
{
static unsigned char i=0;
unsigned char buf;
if(RI==1)
{
buf=SBUF;
switch(i)
{
case 0:
if(buf==0x23)i=1;
break;
case 1:
case 2:
case 3:
case 4:
case 5:
buffer[i-1]=buf;
i++;
if(buf==0x23)
i=1;
if(i==5)
{
do_something_here(buffer);
i=0;
}
break;
default: i=0;break;
}
RI = 0; //RI清零
}
if(TI==1) TI=0; //TI清零
}
这样改符合你的思维习惯吗?实际串口协议解析与协议密切相关,用状态机做比较好。程序中i把它变成状态机的状态,思考一下,改改程序更佳。

2. 51单片机接收多字节数据 串口通信

按发送是四个字节一起出去的,...。
----------------------
它们不是“一起”出去的。
实际上,串行口是按照波特率,把一位一位的二进数,顺序送出去的。
51的接收器,也是按照波特率,一位一位的收。
等到收齐了8个位(如55H),就送到SBUF,并且在RI置一;
再接着收,33H、...等等。

3. 51单片机接收上位机发送的多个字节的串口通信

具体程序可以参考楼下的例程

串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。
通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配:

a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。

b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

c,停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。

如果是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

4. 单片机串口怎么接收超过255字节的数据,数组只能存放255字节,有什么方法可以实现不间断的接收

1、如果开发上位机,然后采用串口与下位机单片机通讯,之后将采集的数据不断回传到上位机数据库中保存,该方案适合大量数据的采集和处理
2、如果仅希望保存于单片机中,在内存允许的情况下,定义一个更大的数组,自然可以实现一定数据量的实现不间断的接收
3、更多交流参考我空间主页有关文章

5. 您好!想向您请教一些关于--51单片机串口通讯多字节接收的问题.劳烦您了~~

写1个接收中断处理函数,
INT8U Branch_RxBuf[10];
INT8U Num_RxData;

void int_Isr (void)
{
INT16U iTemp;
INT8U bFSKValue;
EXTINT = 0x01;
iTemp=Read_Modem(STATUS);
if(iTemp&0x0040){ // 接收中断
bFSKValue=(INT8U)Read_Modem(RX_DATA_BYTE); // 读Recieve Data Register 读取数据 //
Branch_RxBuf[Rx_Idx]=bFSKValue;
Num_RxData++;
if(++Rx_Idx>=MAX_RXDATA){Rx_Idx=0;}
}
}

6. 51单片机如何进行多字节串口接收!!!

看数据量和数据速度,如果数据量小,间隔大。那么完全可以单独接收和显示。如果是间隔时间小,可以在接收到开始标志之后,把需要的数据存在数组中,在收到结束标志之后慢慢解析数据包

7. 求pic18单片机串口接收多字节代码

#include <p18cxxx.h>
#pragmaconfigOSC=HS,OSCS=OFF
#pragmaconfigPWRT=OFF,BOR=OFF
#pragmaconfigWDT=OFF
#pragmaconfigDEBUG=ON
#pragmaconfigLVP=OFF
volatile unsigned charreceiver_buffer;
void usart_isr(void);
#pragma code low_vector=0x18
void low_interrupt (void)
{_asm
goto usart_isr
_endasm
}
#pragma code
#pragma interruptlow usart_isr
void usart_isr (void)
{receiver_buffer=RCREG;} //中断入口就是要求放一个GOTO 跳转指令,中断服务函数用关键词定义,
void main(void)
{while(1){
//IO 初始化
//RB0,RB1,RB2,RB3->output
//RC6,RC7 ->input
PORTB=0x00;
TRISB=0x00;
TRISC=0xc0;
//波特率初始化9600
//Fosc=4MHZ
//BRGH=1
SPBRG=25;
//串口工作方式使能
TXSTAbits.SYNC=0;
TXSTAbits.BRGH=1;
TXSTAbits.TX9=0;
RCSTAbits.SPEN=1;
RCSTAbits.RX9=0;
//中断使能
INTCONbits.GIE=1;
INTCONbits.PEIE=1;
PIE1bits.RCIE=1;
PIE1bits.TXIE=0;
//接收使能
RCSTAbits.CREN=1;
while(1){
//判断接收字节是否为0x55
//是,点LED
//否,继续等待
if(receiver_buffer==0x55){
PORTBbits.RB0=1;
//发送使能
TXSTAbits.TXEN=1;
TXREG=0x55;
}
else
PORTBbits.RB0=0;
}
}
}

8. 请问51单片机如何解决多字节串口发送 接收问题

void init_serialcom 没在main里面调用,你们的串口没初始化。那句 TI=1;
什么用。while (TI== 0); TI= 0 ;中断里面清了 这里再清一遍??
cont++;只有加,没有清零,你只准备接受一次???不带包头识别,你怎么知道什么时候cont应该等于0.总之还有很多问题。

9. 51单片机接收多字节数据 串口通信

按发送是四个字节一起出去的,...。
----------------------
它们不是“一起”出去的。
实际上,串行口是按照波特率,把一位一位的二进数,顺序送出去的。

51的接收器,也是按照波特率,一位一位的收。
等到收齐了8个位(如55H),就送到SBUF,并且在RI置一;
再接着收,33H、...等等。

10. 单片机如何接收多位数数据

声明一个全局变量数组,进入接收中断后,将SBUF存入数组里面,每存入一次,数组标号增加1;长时间没有中断或者接收到结束信号,读出数组里存储的值,并清空计数器和数组,准备进入下一次接收。

阅读全文

与单片机串口接收多字节相关的资料

热点内容
单片机程序员培训 浏览:988
PHP商城源代码csdn 浏览:632
怎么把电脑里文件夹挪出来 浏览:693
java流程处理 浏览:683
ftp创建本地文件夹 浏览:659
腰椎第一节压缩 浏览:738
xp去掉加密属性 浏览:117
2345怎么压缩文件 浏览:982
迷你夺宝新算法 浏览:407
服务器如何防止木马控制 浏览:715
压缩空气用电磁阀 浏览:742
微信为什么不能设置加密认证 浏览:672
邓伦参加密室逃脱视频 浏览:391
音频压缩编码标准 浏览:300
常提到的app是表示什么 浏览:261
天津程序员传销 浏览:349
下班之后的程序员 浏览:73
检测支持ssl加密算法 浏览:344
衢州发布新闻什么APP 浏览:85
中国移动长沙dns服务器地址 浏览:252