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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥串口助手发两次单片机才能收到字符串下面是程序相关的知识,希望对你有一定的参考价值。

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="DIAN YA:";
char str[5];
int len=0;
int qq=0;
uchar buf;
uchar num;
sbit lcdrs=P3^5;
sbit lcdrw=P3^6;
sbit lcden=P3^7;

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


void write_com(uchar com)

lcdrs=0;
P0=com ;
delay(5);
lcden=1;
delay(5);
lcden=0;

void write_data(uchar date)

lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;


void init()

lcdrw=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);


void main(void)

uchar i;
SCON=0x50; //串口方式1
TMOD=0x20; //定时器1,定时方式为2
PCON=0x80; //设定串口工作方式为1
TH1=0xfd; //设定波特率为19200
TL1=0xfd; //
ES = 1;
EA=1;
TR1=1; //启动定时器
init();
for(num=0;;num++)

write_data(table[num]);
delay(20);
if(table[num+1]=='\0')
break;

write_com(0x80+0x4c);
write_data('V');
while(1)
write_com(0x80+0x40);
if (qq==1)
for(i=0;i<5;i++)

write_data(str[i]);


str[5]=0;


//串行中断程序
void int_s(void) interrupt 4
qq=0;
if(RI)
str[len]=SBUF;
RI=0;
ES=0;
SBUF=str[len];
while(!TI);
TI=0;
ES=1;
len++;

qq=1;

参考技术A //qq标志不要再中断中清零, 越界问题自己修改一下吧

bit qq = 0;
//...
void main
//...
while(1)

if (_testbit_(qq) ) // test bit qq and clear

write_com(0x80+0x40);

for(i=0;i<5;i++)
write_data(str[i]);

//str[5]=0; 这句越界了,访问最后一个元素应该是str[4]

//串行中断程序
void int_s(void) interrupt 4

//qq=0;
if(RI)
str[len]=SBUF;
RI=0;
ES=0;
SBUF=str[len];
while(!TI);
TI=0;
ES=1;
len++;//这里len 无限的往下加,当len > 4的时候,str访问越界
qq=1;


追问

不行啊,我想要用串口助手进行连续发送,但他只在复位时才能接收一次,再发送数值就不变了,而串口还能正确接收到变化的数值。
该怎么办啊?

追答

//qq标志不要再中断中清零, 越界问题自己修改一下吧
//由于len 最终会超过4,后续你发送的东西,都填在str所在位置后续的连续内存中了
//很容易就把堆栈冲掉了,程序跑飞
//假设你每发送5个字节显示一次

bit qq = 0;
unsigned char len = 0;
unsigned char str[5];

unsigned char str1[5];

//...
void main
//...
while(1)

if (_testbit_(qq) ) // test bit qq and clear

write_com(0x80+0x40);
for(i=0;i 4的时候,str访问越界
if(len == 5)

qq=1;
//拷贝一份到str1中,防止在显示过程中str被接收到的内容冲掉
str1[0] = str[0];
str1[1] = str[1];
str1[2] = str[2];
str1[3] = str[3];
str1[4] = str[4];
len = 0; //接收计数/下标清零


if(TI)
TI = 0;

本回答被提问者采纳

基于单片机双路温度检测报警系统设计(串口上位机控制)

基于pcf8591 tlc2543的双路温度检测报警系统 带串口上位机控制带仿真 源程序
温度传感器是 LM35
两路测温通道所用的ad芯片分别是pcf8591 和 tlc2543
仿真开始运行后  串口助手发a 启动pcf那路的测量 并显示在6位一体数码管
串口助手发b 启动tlc那路的测量 并显示在6位一体数码管
当tlc那路温度超过100摄氏度 蜂鸣器报警 并且上位机收到error!字符串
pcf那路测温范围0-150摄氏度
tlc那路测温0-120摄氏度 数码管显示到小数点后一位

注意 运行仿真前要把两个lm35的初始温度设置为150摄氏度和30摄氏度 否则会抱错 什么real time simulation failed
上面的lm35初始温度设置为150摄氏度 下面的设置为30摄氏度

  【资源下载】下载地址:点击下载(1628) 百度网盘

#include "tlc2543.h"
#include "uart.h"



#define TIME_PERIOD 300
unsigned char DSY_BUFF_CODE[16] = 0xc0,0xf9,0xa4,0xb0,
					0x99,0x92,0x82,0xf8,
					0x80,0x90,0x88,0x83,
					0xc6,0xa1,0x86,0x8e;
unsigned char txt[] = "Error!";
sbit seg1 = P2^2;
sbit seg2 = P2^3;
sbit seg3 = P2^4;
sbit seg4 = P2^5;
sbit seg5 = P2^6;

sbit bell = P3^7;  //pcf8591那路温度超过100摄氏度 报警
sbit led = P3^6;   //pcf8591那路温度超过100摄氏度 闪灯
void timer_init();
unsigned int read_tmp();

unsigned int temp_pcf8591,temp_tlc2543;
bit flag;

 



void main()

代码省略

 

以上是关于为啥串口助手发两次单片机才能收到字符串下面是程序的主要内容,如果未能解决你的问题,请参考以下文章

CC2530 串口收发字符串

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

stc单片机串口调试的小程序,但是在串口调试助手里,显示接收不到数据,希望大虾们帮忙解决下,下面是程序

为啥用串口调试助手和pic单片机相连发的指令都没有反应呢。

51单片机(CC2530)发送按键次数到串口助手显示 实现功能:按1次按键 串口助手显示1 再按一次 显示2 以此

cacti-0.8.8a 为啥发两次get报文