1.main函数配置:
int main() { uint8_t len; SetSysClock(CLK_SOURCE_PLL_60MHz); GPIOA_SetBits(GPIO_Pin_9); GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); UART1_DefInit(); R8_UART1_LCR |= (RB_LCR_PAR_EN|RB_LCR_PAR_MOD) ; GPIOB_SetBits(GPIO_Pin_7); GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PU); // RXD-配置上拉输入 GPIOB_ModeCfg(GPIO_Pin_7, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平 UART0_DefInit(); R8_UART0_ADR=0x55; R8_UART0_LCR |= (RB_LCR_PAR_EN|0x20); #if 1 // 中断方式:接收数据后发送出去 UART0_ByteTrigCfg(UART_7BYTE_TRIG); trigB = 7; UART0_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT); PFIC_EnableIRQ(UART0_IRQn); #endif while(1); }
2.串口中断服务函数:
__INTERRUPT __HIGH_CODE void UART0_IRQHandler(void) { volatile uint8_t i; switch(UART0_GetITFlag()) { case UART_II_SLV_ADDR: // 从机地址 { break; } case UART_II_LINE_STAT: // 线路状态错误 { UART0_GetLinSTA(); break; } case UART_II_RECV_RDY: // 数据达到设置触发点 for(i = 0; i != trigB; i++) { RxBuff[i] = UART0_RecvByte(); UART0_SendByte(RxBuff[i]); } break; case UART_II_RECV_TOUT: // 接收超时,暂时一帧数据接收完成 i = UART0_RecvString(RxBuff); UART0_SendString(RxBuff, i); break; case UART_II_THR_EMPTY: // 发送缓存区空,可继续发送 break; case UART_II_MODEM_CHG: // 只支持串口0 break; default: break; } }
使用注意点:
当59x串口校验位配置成mark时,对方发送需要配置为space或数据位第九位为0,
当59x串口校验位配置成space时,对方发送需要配置为mark或数据位第九位为1。
手册介绍:
