尊敬的 TI 专家:
现在、我正在设计 BMS、使用 MSP430F1611 UART1与一台主机进行通信、主机使用 Modbus 协议、仅使用两个器件、因此我使用异步通信格式、协议使用空闲线格式。
串行端口配置如下:波特率为9600、数据位为8、无奇偶校验位、两个停止位
Modbus 协议、如:0x01 0x03 address shi 地址插槽 numhi numlo crc16lo crc16hi
uart1配置如下:
void VMU_UART_init_9600 (void)
{
BCSCTL1 |= XTS;//高频模式
UCTL1 |= SWRST;//初始 UART
UTCTL1 = SSEL0;// ACLk (32768)、默认字符、而不是地址
UBR01 = 0xC0;//波特率:9600 ACLK:1843200/192 = 9600
UBR11 = 0x00;
UMCTL1 = 0x00;
UCTL1 |= CHAR + SPB;//8位、无奇偶校验、两个停止位
P3SEL |= 0xc0;//P3.7 RX、P3.6 TX
P3DIR |= 0x40;
P5DIR |= BIT4;//收发器 DE、RE 使能
P5OUT &=~BIT4;// DE=0、R/E/=0 RX 是默认状态、不是 TX
UCTL1 &=~SWRST;//启动 UART
ME2 = UTXE1 + URXE1;// uart1 TX 和 Rx 模块使能
IE2 |= URXIE1;
}
ISR 接收如下:
由于我无法判断数据包的开始和结束、我的想法是等待下一个字节设置为 URXIFG、并在接收到的第一个字节为0x01时读取接收缓冲寄存器、1200是超时值
#pragma vector=UART1RX_vector
_interrupt void RX_VMU_byte (void)
{
U8 I;
U16时间;
VMURS485Buf[0]=RXBUF1;
if (VMURS485Buf[0]= 0x01)
{
对于(时间=0;时间<1200 &&!(IFG2&URXIFG1);时间++)
IF (时间< 1200)
VMURS485Buf[1]= RXBUF1;
if (VMURS485Buf[1]= 0x03)
{
对于(I = 2;I < 8;I++)
{
对于(时间=0;时间<1200 &&!(IFG2&URXIFG1);时间++)
IF (时间< 1200)
VMURS485Buf[i]= RXBUF1;
}
}
UART_RESPONSE (VMURS485Buf);
}
}
当我使用串行端口软件发送命令0x01 0x03 0x00 0x01 0x00 0x06 crclo crchi 时
但 VMURS485Buf[1]= RXBUF1;为0x01而不是0x03
值1200为超时