关于串口的疑问
时间:10-02
整理:3721RD
点击:
小弟在用串口时遇到问题,请各位指教。通过助手发一串数据,比如{6,1,2,3,4,5,7},其中第一个字节是所需数据的个数,后面部分是所需数据本身。像例子就是我要发6个数据,最终在串口助手上显示{1,2,3,4,5,7}这样的效果。
可我在助手发送4帧{6,1,2,3,4,5,7}后,显示如图
现附上代码,烦请各位指正下,多谢了
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define cnt_send_ceiling 50 //确保接收缓冲区没有继续接受数据,是变量send_cnt的溢出阀值
uchar RxUART_buf[40]; //串口接收缓冲区,可以根据实际项目设置大小
uchar UART_buf_temp[40]; //临时处理串口数据的缓冲区,可以不用那么大
uchar send_update; //数据发送更新标志
uchar cnt_RxNum = 0; //串口接收字节个数计数
uchar send_cnt;
//串口初始化
void UART_Init()
{
SM1 = 1; //工作方式1
SM0 = 0;
PCON = 0x00; //MSB:SMOD =0单倍速率 =1加倍数率
TMOD = 0x20; //定时器1工作方式2.
TH1 = 0xFD; //9600bps
TL1 = 0xFD;
TR1 = 1; //定时器T1开始工作,TR1=0,T1停止工作
REN = 1; //允许接收
ES = 1; //开串口中断
EA = 1; //开总中断
}
//延时
void delay_ms(uint ms_num)
{
uint i;
uchar j;
for(i = 0;i < ms_num;i ++)
for(j = 0;j < 110;j ++)
;
}
//发送
void UART_Dispatch( uchar *pdat )
{
SBUF = *pdat; //装载待传送数据
while( !TI ); //等待串口传送结束(TI =0)
TI = 0; //将串口中断标志位置0
//delay_ms(3);
}
void UART_Dis(uchar dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
void main()
{ uchar i = 0,j,k;
uchar data_size;
uchar send_lock; //
delay_ms(500);
UART_Init();
while(1)
{
if(send_update)
{
send_cnt ++; //send_cnt累加,因为有数据更新,它在串口中断里就被置0,永远饿着;直到发送完,才跳到这里喂饱,此时说明更新完毕
if((send_cnt >= 50)&&(RI == 0) ) //判断是否已经发送完毕了,同时又可延时一段时间,确认缓冲区没有继续接受数据
{
send_cnt = 0;
send_update = 0;
send_lock = 1; //开自锁标志,用于发送完毕后,数据处理
}
}
//串口传输已完毕,接下来进行数据的处理
///*
else
{
if(send_lock && (cnt_RxNum>0))
{
send_lock = 0;
cnt_RxNum = 0;
data_size = RxUART_buf[0];//第一个数据为所发送所需数据的个数
for(j = 1;j <= data_size;j ++)
{
UART_buf_temp[j - 1] = RxUART_buf[j];
UART_Dispatch( &UART_buf_temp[j - 1] ); //显示
}
send_update = 1;
}
}
}
}
//中断处理
void RxByte() interrupt 4 //using 3
{
if( RI == 1 )
{
ES = 0; //关串口中断 ,方便进行处理
RI = 0;
send_update = 1; //数据在发送更新标志
send_cnt = 0;
RxUART_buf[cnt_RxNum] = SBUF; //将数据存到接收缓冲区
cnt_RxNum ++; //对接收数据字节个数进行统计
ES = 1; //开串口中断,启动下一个字节数据发送
}
}

有点问题
关于串口的疑问
