pc用串口助手给单片机发一字符串,收到的数据在LCD1602上显示,遇到问题,求大神指导

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pc用串口助手给单片机发一字符串,收到的数据在LCD1602上显示,遇到问题,求大神指导相关的知识,希望对你有一定的参考价值。

我在中断用数组接收,可是只能收到第一个字节,用的是RS485电平转换,不知道是不是程序编的哪有问题
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar table[10]="send data:";
uchar table1[13]="receive data:";
sbit lcden=P3^6;
sbit lcdrs=P2^6;
sbit lcdrw=P2^7;
sbit RS485_E=P1^7;
uchar num,playflag;
uchar c,count;
uchar buf[10]=0;
void delay(uint z)

uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);

// 写命令子函数
void write_cmd(uchar cmd)

lcdrs=0;
lcden=0;
P0=cmd;
lcdrw=0;
delay(5);
lcden=1;
delay(5);
lcden=0;
delay(5);

//写数据子函数
void write_data(uchar dataa)

lcdrs=1;
P0=dataa;
//lcdrw=0;
delay(5);
lcden=1;
delay(5);
lcden=0;

//液晶初始化
void init()

lcden=0;
write_cmd(0x38);// 设置16*2显示,5*7的点阵,8位数据口
write_cmd(0x0c);//开显示,不显示光标
write_cmd(0x06);
write_cmd(0x01);//清屏
write_cmd(0x80);//初始化数据指针

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

write_data(table[num]);
delay(5);

write_cmd(0x80+0x40);
for(num=0;num<14;num++)

write_data(table1[num]);
delay(5);


void change1(uchar s)

uchar p,q;
q=s/16;
if(q<10)
q=q+0x30;
else
q=q+0x37;
write_cmd(0x80+0x40+0x0d);
delay(5);
write_data(q);
delay(20);
p=s%16;
if(p<10)
p=p+0x30;
else
p=p+0x37;
write_cmd(0x80+0x40+0x0e);
delay(5);
write_data(p);
delay(20);

/********串行口初始化程序**********/
void init1()

SM0=0;
SM1=1;//设置为串行口工作方式1
REN=1;// 允许串行口接收
TI=0;
RI=0;
PCON=0;
TH1=0xFD;
TL1=0XFD;
TMOD=0X20;//用作定时器,工作在方式2
EA=1;
ET1=0;
ES=1;
TR1=1;
RS485_E=0;

void putchar( uchar ch )//发送数据

SBUF = ch;
while( !TI );
TI = 0;


//主函数
void main()
uchar i,j;
init();
init1();

while(1)


TI=0;
if(playflag==1)
playflag=0;
RS485_E = 1;
for(i=0;i<10;i++)
putchar(buf[i]) ;
RS485_E = 0;
for(j=0;j<10;j++)
change1(buf[j]);
delay(100);

TI=0;




void serial() interrupt 4

RS485_E=0;

ES=0;
if(RI)

buf[count++]=SBUF;
playflag=1;

if(count==10)
count=0;

RI=0;

ES=1;

pc用串口助手给单片机发一字符串,
----
字符串,都有多少字符?
发一个字符,用多少时间?

你到程序,当单片机收到第一个字符,马上,就改变了 485 的传输方向,
向 PC 机发送一串字符,这要用多少时间?

单片机,发送这一串之后,再令 485 为接收,此时,还能收到什么呢?
PC 机,早已经就发送完,整串字符了。追问

大哥,我对485不是很清楚,能不能详细点或者告诉我怎么改,谢谢你了啊

追答

使用 485,只能《半双工》传送。
单片机,必须等接收完毕,才能转为发送。

PC 发送,也不能自顾自的不断发送,发送几个,就要等一会,收到了回信,再发送其它。

多字节的串口通信,不是随便就发送一串字符串的。
必须先制订协议。
收、发什么,收、发的时序,必须先设计好。

具体,可以到百度文库搜一下485通信。

参考技术A 可以用 proteus 仿真一下

proteus 论坛有很多高手

单片机串口通信控制led灯的点亮

参考技术A pc通过串口和单片机交换数据,从而控制LED灯。 pc程序用labview 调用Visa 进行串口通讯。单片机接受到串口命令后控制I/O口的高低电平实现led灯亮灭控制。
用串口调试助手就行,网上到处可以下载。也好用。关键问题是在电脑上发送的0,1,是以什么数据格式发送的,通常以字符格式发送的,即是ASCII码。所以,单片机接收时,也要按字符格式发才行。而你的程序是按十六进制数的格式判断的,也就是二进制数,所以,发送和接收格式不统一,单片机就不能正常接收控制LED0,也就不能正常返回数据。 if(SBUF==0) //这是按二进制数接收的 if(SBUF==1) //这也是按二进制数接收的 这样写程序,要求电脑上,要按二进制数即十六进制数发送才行。 还是按字符格式收发比较好。
看你这程序编的,ha 查询RI 不是等于 1,而是0 只有当数据传送过来的时候,RI才会由1变为0,所以需要查询的状态是 0,不是1 当接收完数据后,再进行对RI的清零 还是不多说了,上程序,若满意请记得采纳一下,谢谢! 这是一个由串口助手发送十六进制码来控制单片机的8个LED亮灭的简单小程序
电脑上,你是用什么软件发送数据的看用串口调试助手就行,网上到处可以下载。也好用。关键问题是在电脑上发送的0,1,是以什么数据格式发送的,通常以字符格式发送的,即是ASCII码。所以,单片机接收时,也要按字符格式发才行。而你的程序是按十六进制数的格式判断的,也就是二进制数,所以,发送和接收格式不统一,单片机就不能正常接收控制LED0,也就不能正常返回数据。

以上是关于pc用串口助手给单片机发一字符串,收到的数据在LCD1602上显示,遇到问题,求大神指导的主要内容,如果未能解决你的问题,请参考以下文章

pc机与单片机98c52 串口通信 用串口通信助手,发送一个数,单片机接收后返回串口通信助手显示出来。

51系列单片机与PC端串口调试助手进行串口通信

stm8用串口通信,数据发不出去

为啥串口助手发两次单片机才能收到字符串下面是程序

CC2530开发模块与51单片机如何实现串口通信

借助虚拟串口驱动软件模拟Proteus中51单片机与PC端串口调试助手软件相互通信