uart接收和发送数据 25
uart异步接收数据的时候,总是无法接收完整的字符串,通过网上查找,串口接收和发送都是一个个字节进行。功能:通过串口调试工具往串口发送数据,然后在接收完整的数据后再将数据...
uart异步接收数据的时候,总是无法接收完整的字符串,通过网上查找,串口接收和发送都是一个个字节进行。
功能:通过串口调试工具往串口发送数据,然后在接收完整的数据后再将数据发给电脑。
问题如下:
1.串口在接收数据的时候,我是发送数据是不是需要通过一个标志位进行接收完整的判断,如果接收到了这个字节然后才执行将数据发给电脑?
2.我通过串口调试工具往串口发送数据的时候,例如:数据01 02 03;通过调试SBUF也是常出现只获取到部分数据,而且部分是数据是随机性。这个到底是啥子原因?
void serial () interrupt 4
{
u8 inuartnum = 0;
u8 UARTBuf[36]=0;
while (1 == RI_0) //when receiving data, hardware automatic set 1
{
RI_0 = 0 ;
//if(inuartnum<36 )
{
UARTBuf[inuartnum]=SBUF0;
inuartnum++;
}
//SBUFData = SBUF0;
}
ReadFlag = 1;
}
通过中断查看 ,UARTBuf 里面存储的总是发送出去的某一个数据,都是无法将全部的数据接收。
如果用一个for(i = 0; i < 1000; i++) 作为1000ms等待时间在不断的接收,可以将所有的数据都收到。但是作为单片机,这种处理只能让cpu在那等待,在应用上不可靠。还有啥办法啊? 展开
功能:通过串口调试工具往串口发送数据,然后在接收完整的数据后再将数据发给电脑。
问题如下:
1.串口在接收数据的时候,我是发送数据是不是需要通过一个标志位进行接收完整的判断,如果接收到了这个字节然后才执行将数据发给电脑?
2.我通过串口调试工具往串口发送数据的时候,例如:数据01 02 03;通过调试SBUF也是常出现只获取到部分数据,而且部分是数据是随机性。这个到底是啥子原因?
void serial () interrupt 4
{
u8 inuartnum = 0;
u8 UARTBuf[36]=0;
while (1 == RI_0) //when receiving data, hardware automatic set 1
{
RI_0 = 0 ;
//if(inuartnum<36 )
{
UARTBuf[inuartnum]=SBUF0;
inuartnum++;
}
//SBUFData = SBUF0;
}
ReadFlag = 1;
}
通过中断查看 ,UARTBuf 里面存储的总是发送出去的某一个数据,都是无法将全部的数据接收。
如果用一个for(i = 0; i < 1000; i++) 作为1000ms等待时间在不断的接收,可以将所有的数据都收到。但是作为单片机,这种处理只能让cpu在那等待,在应用上不可靠。还有啥办法啊? 展开
2个回答
展开全部
#include<pic.h> //包含单片机内部资源预定义
#ifndef uchar
#define uchar unsigned char
#define uint unsigned int
#endif
//__CONFIG(0x2129);
bit rec_flag; //串口中断标志位,有串口中断,置1
uchar uartdata; //串口数据保存到此位置中
void Uart_char(uchar dat);//串口发送一个数据
/*************************************************************
函数原型:void main(void)
功 能:等待串口发送中断到来,将接收到的设计再通过串口发回
*************************************************************/
void main(void)
{
TRISB1=1;
TRISB2=1;
SPBRG=0X19; //设置波特率为9600BPS
TXSTA=0X24; //使能串口发送,选择高速波特率
RCSTA=0X90; //使能串口工作,连续接收
RCIE=0X1; //使能接收中断
GIE=0X1; //开放全局中断
PEIE=0X1; //使能外部中断
//INTCON=0X00;
/* while(1) //查询模式下
{
RCIE=1;
while(RCIF==0);
RCIE=0;
Send_char(RCREG);
}
*/
while(1) //中断模式下,等待中断的到来
{
if(rec_flag==1) //如果接收中断到来
{
rec_flag=0; //接收标志清零
Uart_char(uartdata); //将接收来的数据发送到串口
}
}
}
/**********************************************
函数原型:void Uart_char(uchar dat)
功 能:将dat数据通过串口传送出去
**********************************************/
void Uart_char(uchar dat)
{
TXREG=dat; //将dat数据存入TXREG
// TXEN=1; //启动发送,TSR开始移位操作。
while (TRMT==0); //判断是否TSR发送完毕,未完等待。
// TXEN=0; //关发送功能,防止TXREG空时,TXIF产生置位
}
/**********************************************
函数原型:void interrupt usart(void)
功 能:串口接收到数据,接受发来的数据将接
收到数据标志位rec_flag置1
**********************************************/
void interrupt usart(void)
{
if(RCIF) //判断是否为串口接收中断
{
rec_flag = 1;
//RCIF=0;
uartdata = RCREG; // 接收数据并存储
//TXREG=recdata ; //把接收到的数据发送回去
}
}
这段程序应该对你有用
#ifndef uchar
#define uchar unsigned char
#define uint unsigned int
#endif
//__CONFIG(0x2129);
bit rec_flag; //串口中断标志位,有串口中断,置1
uchar uartdata; //串口数据保存到此位置中
void Uart_char(uchar dat);//串口发送一个数据
/*************************************************************
函数原型:void main(void)
功 能:等待串口发送中断到来,将接收到的设计再通过串口发回
*************************************************************/
void main(void)
{
TRISB1=1;
TRISB2=1;
SPBRG=0X19; //设置波特率为9600BPS
TXSTA=0X24; //使能串口发送,选择高速波特率
RCSTA=0X90; //使能串口工作,连续接收
RCIE=0X1; //使能接收中断
GIE=0X1; //开放全局中断
PEIE=0X1; //使能外部中断
//INTCON=0X00;
/* while(1) //查询模式下
{
RCIE=1;
while(RCIF==0);
RCIE=0;
Send_char(RCREG);
}
*/
while(1) //中断模式下,等待中断的到来
{
if(rec_flag==1) //如果接收中断到来
{
rec_flag=0; //接收标志清零
Uart_char(uartdata); //将接收来的数据发送到串口
}
}
}
/**********************************************
函数原型:void Uart_char(uchar dat)
功 能:将dat数据通过串口传送出去
**********************************************/
void Uart_char(uchar dat)
{
TXREG=dat; //将dat数据存入TXREG
// TXEN=1; //启动发送,TSR开始移位操作。
while (TRMT==0); //判断是否TSR发送完毕,未完等待。
// TXEN=0; //关发送功能,防止TXREG空时,TXIF产生置位
}
/**********************************************
函数原型:void interrupt usart(void)
功 能:串口接收到数据,接受发来的数据将接
收到数据标志位rec_flag置1
**********************************************/
void interrupt usart(void)
{
if(RCIF) //判断是否为串口接收中断
{
rec_flag = 1;
//RCIF=0;
uartdata = RCREG; // 接收数据并存储
//TXREG=recdata ; //把接收到的数据发送回去
}
}
这段程序应该对你有用
追问
//RCIF=0;
这里为啥注释了,不用将接收标志置0么?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询