C51单片机从串口接收数据多个字节的数据的C语言程序,谢谢

C51单片机从串口接收数据多个字节的数据的C语言程序,谢谢,第1张

#include<reg52h>

unsigned char code table[] ={" "};

unsigned char code table1[]={" : "};

sbit rs=P1^2;

sbit lcden=P1^0;

unsigned char flag,m;

void delay(int xms)

{

int i,j;

for(i=xms;i>0;i--) //i=xms即延时约xms毫秒

for(j=110;j>0;j--);

}

void write_com(unsigned char com)

{//写液晶命令函数

rs=0;

lcden=0;

P2=com;

delay(3);

lcden=1;

delay(3);

lcden=0;

}

void write_date(unsigned char date)

{//写液晶数据函数

rs=1;

lcden=0;

P2=date;

delay(3);

lcden=1;

delay(3);

lcden=0;

}

void init()

{//初始化函数

unsigned char num;

lcden=0;

rs=0;

write_com(0x38);//1602液晶初始化

write_com(0x0c);

write_com(0x06);

write_com(0x01);

write_com(0x80);

for(num=0;num<15;num++)//写入液晶固定部分显示

{

write_date(table[num]);

delay(3);

}

write_com(0x80+0x40);

for(num=0;num<5;num++)

{

write_date(table1[num]);

delay(3);

}

}

void write_dianya(unsigned char add,unsigned char date)

{//1602液晶刷新时分秒函数4为时,7为分,10为秒

unsigned char bai,shi,ge;

bai=date/100;

shi=date%100/10;

ge=date%10;

write_com(0x80+0x40+add);

write_date(0x30+bai);

write_date(0x30+shi);

write_date(0x30+ge);

}

void main ()

{

init();

TMOD=0x20; //设置定时器1工作方式2

TH1=0xfd;

TL1=0xfd;

TR1=1;

REN=1; //设置串行口工作方式

SM0=0;

SM1=1;

EA=1; //中断设置

ES=1;

while(1)

{

if(flag==1)

{

ES=0;

SBUF=m;

while(!TI);

TI=0;

ES=1;

}

}

}

void ser() interrupt 4

{

RI=0;

m=SBUF;

write_dianya(5,m);

flag=1;

}

您好,单片机程序可能一直卡在串口接收的原因有很多,可能是因为没有正确设置串口参数,也可能是因为没有正确配置串口硬件,还可能是因为没有正确编写串口程序,或者是因为接收到的数据格式不正确,或者是因为接收到的数据长度不正确,或者是因为接收到的数据内容不正确等。因此,要解决这个问题,首先要检查串口参数是否正确,检查串口硬件是否正确,检查串口程序是否正确,检查接收到的数据格式是否正确,检查接收到的数据长度是否正确,检查接收到的数据内容是否正确,以及检查其他可能存在的问题。

USART是一个外设,对于CPU在与外设进行通讯的时候通常采用两种方式:轮询和中断。

轮询指定是CPU不停的查询外设的状态,在一定的状态下进行相关的 *** 作。以USART输出为例。当查询到USART为空闲时,可以向输出寄存器内写入内容。继续查询状态,空闲后可以继续写入内容知道传输结束。

中断方式指的是在外设状态发生改变时,即有事件发生后,由中断程序来响应对应的事件。中断方式比轮询方式的优势在于可以减轻CPU的负担。使用DMA来传输数据是中断方式中的一种处理方式,通常不将其称为一种特别的模式。

……你自己把逻辑锁死了。收到一回4字节序列后,flag1置位,之后发送数据。可是在发送数据的时候又会进入中断的,由于接收缓冲区中还是那4字节的序列,于是flag1再次被置位……于是乎进入永不停歇的死循环。

你的串口中断应当判断一下是发送还是接收……

4年

关注

查询方式:发送数据——先发后查;

接收数据——先查后收。

中断方式:发送数据——发送、等待中断、中断中发送;

接收数据——等待中断、在中断中接收。

1、在电脑端安装一个COM-HC的串口调试工具,打开串口调试软件如下图所示。

2、我们首先设置的就是调试工具的端口号与波特率,按着设备在电脑端识别到的端口号来设置,波特率要按着设备的波特率来设置。

3、接着就是设置接收到的报文的显示形式的,系统默认二进制显示,我们要将其改成16进制显示,如下图直接勾选即可。

4、由于显示的接收到的报文很多,我们一时看不过来,我们可以将它保存到指定的文件夹下,方便我们二次查看,如下图所示设置路径。

5、前面的这些步骤设置完成后就可以直接打开串口,接收报文了,如下图所示打开串口按键。

6、串口调试工具的上部分为接收报文界面,下半部分为自己发送的报文,来得到设备的回复,如下图所示。

题主是否想询问“串口转ttl一次发送多次接收实现的方法”方法是设置串口通信参数、编写发送和接收程序、调试和测试。

1、设置串口通信参数:在使用串口通信时,需要设置波特率、数据位、停止位、校验位等参数,以保证发送和接收数据的正确性。根据具体的需求和硬件设备,选择合适的参数进行设置。

2、编写发送和接收程序:在程序中,使用串口发送数据时,可以通过循环的方式,多次发送相同的数据。接收数据时,需要设置一个循环,不断接收串口传来的数据,并对数据进行处理。

3、调试和测试:在实际使用中,可以通过串口调试工具等方式,对发送和接收程序进行测试和调试,以确保数据的正确性和稳定性。如果发现数据传输出现问题,可以检查串口通信参数、程序逻辑、硬件连接等方面,进行排查和调整。

串口接收程序没有贴上来,所以无从知道问题所在,但注意到你用了指令ACALL,又有

ORG 06D0H

这样的话,可能有问题,因为ACALL只能调用2K范围内的子程序或函数,超出就会出错了。

以上就是关于C51单片机从串口接收数据多个字节的数据的C语言程序,谢谢全部的内容,包括:C51单片机从串口接收数据多个字节的数据的C语言程序,谢谢、为什么单片机程序一直卡在串口接收、简述STM32的USART三种编程方式:轮询方式、中断方式、DMA方式等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10179014.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存