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;
----
字符串,都有多少字符?
发一个字符,用多少时间?
你到程序,当单片机收到第一个字符,马上,就改变了 485 的传输方向,
向 PC 机发送一串字符,这要用多少时间?
单片机,发送这一串之后,再令 485 为接收,此时,还能收到什么呢?
PC 机,早已经就发送完,整串字符了。追问
大哥,我对485不是很清楚,能不能详细点或者告诉我怎么改,谢谢你了啊
追答使用 485,只能《半双工》传送。
单片机,必须等接收完毕,才能转为发送。
PC 发送,也不能自顾自的不断发送,发送几个,就要等一会,收到了回信,再发送其它。
多字节的串口通信,不是随便就发送一串字符串的。
必须先制订协议。
收、发什么,收、发的时序,必须先设计好。
具体,可以到百度文库搜一下485通信。
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上显示,遇到问题,求大神指导的主要内容,如果未能解决你的问题,请参考以下文章