dsPic30F5015,上电复位后,电脑给单片机发送的第一个字节数据总是丢失,而从第二个字节就都能正确接收!
看了数据手册关于串口的介绍,也没找到相关的内容,无奈还是请高人指点了!
请……高手给指点!
已经大概知道是指针的使用出了问题,但是找不出问题的所在,串口能接收到第一个字节的数据,但经过指针后的处理就把复位后的第一个字节整没了,
不知道问题在哪里,继续等……
#define BAUDRATE 19200
#define UART_RECEIVE_BUF_LEN 0x10
#define UART_SEND_BUF_LEN 0x10
#define UART_RECEIVING 0x80
#define UART_RECEIVED 0x40
#define UART_NOT_RECEIVED 0
#define UART_RECEIVE_TIMEOUT 10
typedef struct
{
unsigned char state; //串口状态
unsigned char combyte; //命令字
unsigned char ReceiveLen; //接收到数据长度
unsigned char ReceiveBuf[UART_RECEIVE_BUF_LEN ]; //接收缓冲区
unsigned char *Receiveptr; //接受指针
unsigned char Rewaittime; //接收等待时间
unsigned char SendLen; //要发送数据长度
unsigned char *SendPtr; //发送指针
unsigned char SendBuf[UART_SEND_BUF_LEN]; //发送缓冲
}
UartStruct; //串口结构
//在此可添加用户程序中使用的全部变量
UART1 UartStruct UartStr;
UART1 unsigned int TickFlag; //主程序循环计数
///////////////////////////////////////////////////////////////////////////////////////////////////
// 名称: __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void)
// 功能: 主程序运行及时;判断UART1接受数据完成
// 入口参数: 无
// 出口参数: 无
///////////////////////////////////////////////////////////////////////////////////////////////////
void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void)
{
IFS0bits.T1IF = 0;/* Clear Timer interrupt flag */
TickFlag ++;
if(TickFlag==10000){
TickFlag=0;
LED3_FLASH;
if(PumpRunTime_Flag){ //LED闪烁指示程序运行
PumpRunTime--;
// LED2_FLASH_N(6,50);
}
}
if(UartStr.state&UART_RECEIVING ){
UartStr.Rewaittime++; //接收等待时间自加
if(UartStr.Rewaittime>UART_RECEIVE_TIMEOUT){//接收等待时间超时
UartStr.Receiveptr=UartStr.ReceiveBuf;
UartStr.Rewaittime=0;
UartStr.state = UART_RECEIVED;
if(UartStr.state&UART_RECEIVED){//判断是否有止命令
if(UartStr.ReceiveBuf[0]==0xbb&&UartStr.ReceiveBuf[1]==0x00){
PumpState=0;
PumpRunTime = 0;
RRS1_220_OFF;
RRS2_220_OFF;
RRS3_24_OFF;
MotorStruct[0].MoveFlag = 0;
MotorStruct[1].MoveFlag = 0;
MotorStruct[2].MoveFlag = 0;
}
if(UartStr.ReceiveBuf[0]==0xbb&&UartStr.ReceiveBuf[1]==0x01){
PumpState=0x10;
PumpRunTime = 0;
MotorStruct[0].MoveFlag = 0;
MotorStruct[1].MoveFlag = 0;
MotorStruct[2].MoveFlag = 0;
}
}
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// 名称: __attribute__((interrupt, no_auto_psv)) _U1RXInterrupt(void)
// 功能: UART1接收数据中断
// 入口参数: 无
// 出口参数: 无
///////////////////////////////////////////////////////////////////////////////////////////////////
void __attribute__((interrupt, no_auto_psv)) _U1RXInterrupt(void)
{
IFS0bits.U1RXIF = 0; // clear interrupt flag
if(UartStr.ReceiveLen<UART_RECEIVE_BUF_LEN){
*UartStr.Receiveptr++=U1RXREG;
UartStr.ReceiveLen++;
UartStr.state |= UART_RECEIVING;
UartStr.Rewaittime=0;
}
}
一周热门 更多>