|
设备型号:DMG10600T101_A5WTC(串口2是 RS232、串口4是RS485、串口5是RS232)
已经正常使用串口2和串口4,目前需要启用串口5,参考前两个串口初始化代码写了初始化代码
测试发现对端发送数据在屏幕上接收到的数据总是在前端加了一些不知道哪来的东西
比如:
对端发送: a548 0931 0000 05a3 ffff fec5 0041 3506
接收到的:c0 a548 0931 0000 05a3 ffff fec5 0041 3506
就是前边多了一个c0,有的时候是00 或者 80 之类的,也有的时候是完全不对的数据
不知道是哪里有问题。
代码如下:
xdata u16 uart5_rx_sta; //bit15用于标志是否已接受到一个完整的数据包,bit14:0用于存储当前数据包的长度
xdata u8 uart5_buf[UART5_PACKET_MAX_LEN+2]; //留2个空字符的位置
u16 g_uart5_mstick = 0; //用于判断数据发送间隔
//用于使用者调用设置波特率,需要先注册波特率再初始化串口
void uart5_SetBaud(u32 ulBaud)
{
u32 baud;
//T5L主频为206.4384MHZ,BODE3_DIV_H = 主频/(8*波特率)
baud = (u16)(25804800.0f/ulBaud);
BODE3_DIV_H=(baud>>8)&0xff;
BODE3_DIV_L=baud&0xff;
}
void uart5_TimerHandle()
{
//时间间隔结束方式使能
if(uart5_rx_sta&UART5_PACKET_OK)//接收好的数据还未被处理,当前并不是等待数据处理状态
return;
if((uart5_rx_sta&UART5_PACKET_LEN) == 0) //没有接收到数据
return;
//已经接收到数据,开始计数
g_uart5_mstick ++;
if (g_uart5_mstick > UART5_END_INTERVAL_MS)
{
//达到间隔,此帧数据结束
uart5_rx_sta |= UART5_PACKET_OK;//标记数据包接受完成
g_uart5_mstick = 0;
}
}
void UART5_Init(void)
{
SCON3T=0x80;
SCON3R=0x80;
uart5_SetBaud(UART5_BAUD_DEFAULT); //9600默认波特率
//ES3T=1;
ES3R=1;
//RS485_TX_EN=0;
EA=1;
TR5 = 0;
uart5_rx_sta = 0;
g_uart5_mstick = 0;
}
//发送数据
void Uart5_SendData(u8 *bytes,u16 len)
{
u16 i;
for(i=0;i<len;i++)
{
SBUF3_TX = bytes;
while((SCON3T&0x01)==0);
SCON3T &=0xFE;
}
}
void UART5_TX_ISR_PC(void) interrupt 12
{
SCON3T&=0xFE ;
}
void uart5_isr() interrupt 13
{
u8 res;
//EA=0;
if((SCON3R&0x01)==0x01)
{
SCON3R&=0xFE;
res=SBUF3_RX;
if(uart5_rx_sta&UART5_PACKET_OK)//接收好的数据还未被处理
{
//EA=1;
return;
}
g_uart5_mstick = 0;//只要有数据来就重新记时
if(uart5_rx_sta>=UART5_PACKET_MAX_LEN)
uart5_rx_sta = 0;//数据超量了,丢弃掉,重头开始接收
uart5_buf[uart5_rx_sta++] = res;//存储有效数据
}
//EA=1;
}
|
|