3485芯片与149单片机通过Modbus协议通信,需要确保单片机的串口配置正确,并且Modbus协议被正确实现。
下载贤集网APP入驻自媒体
我将3485芯片与149单片机的相连,用modbus协议进行通讯,用异步通信串口0来接受数据,程序里头用定时器中断来定时收完8个字节,之后进行数据处理(CRC之类的) max3485初始化程序为: bool Init_Max3485(void) { ME1 |= (UTXE0 + URXE0); // Enable USART0 TXD/RXD UCTL0 = CHAR + SPB + SWRST; // 8位数据 两位停止位 无校验 UTCTL0 |= SSEL0;// UCLK = ACLK URCTL0 |= 0x08; // sleep mode UBR00 = 0x41; UBR10 = 0x03; // 波特率设置为9600 // UMCTL0 = 0x00; // no modulation UCTL0 &= ~SWRST; // Initialize USART state machine IE1 |= URXIE0 + UTXIE0; // 使能接受和发送中断 IFG1&=~UTXIFG0;//使UTXIFG0复位 return true; } 然后处理的程序为:串口中断为: #pragma vector = UART0RX_VECTOR //串口0接收中断函数 __interrupt void Uart0Rx_Isr(void) { // CCR1 =TARA+5000; //CCR1中断允许 TACTL|=TACLR; //ACLK,清TAR CCTL1 &=(~CCIFG); CCTL1|=CCIE; receBuf[receCount]= RXBUF0; receCount++; //接收地址偏移寄存器加1 } 定时器A1中断处理 #pragma vector = TIMERA1_VECTOR //定时器A1中断函数 __interrupt void Timer_A1_Isr(void) { TACTL|=TACLR; CCR1 =TAR+1000; //CCR1中断允许 if(receCount==8) { receTimeOut++; if(receTimeOut>=1) { receTimeOut=1; MAX3485_TRNS_ENA(); //将485置为发射状态 } } CCTL1 &=(~CCIE); CCTL1 &=(~CCIFG); // UART_ENTER_SLEEPA(); } 其他的程序太多感觉跟我遇到的问题关系不大,现在的问题就是,我用串口调试器通讯的时候总通讯不成功,总提示超时,波特率之类的设置应该也没问题,我从串口调试器读数据的时候 发送的是01 03 00 01 00 01 D5 CA , 这是8个字节,按道理说,我的单片机串口应该会进入8次中断,但是就是只进去一次中断,并且进去的这一次中断收到的数跟发送的数也对不上, 都困扰死我了,还望高手给予指教,谢谢了!