举报
/*查询发送字节*/ void uart_send_byte( uint8 ch ) { /*如果当前串口状态寄存器非空闲,则一直等待*/ /*注意while循环后的分号,表示循环体为空操作*/ while( !UART_IS_IDLE() ); /*此时将发送字节写入发送寄存器*/ UART_TX_REG = ch; } /*发送一个缓冲区*/ void uart_send_buffer( uint8 *pBuf,uint8 size ) { uint8 i = 0; /* 异常参数处理*/ if( pBuf == NULL ) return; for( i=0; i<size;i++ ) { send_byte( pBuf[i] ); } }对于接收而言,如采用查询模式则几乎是没有任何应用价值,因为外部数据不知道什么时候会到来,所以查询接受就不描述了,这里描述一下中断接收。复制static uint8 rx_index = 0; void uart_rx_isr( void ) { /* 接收报文处理 */ rx_buffer[rx_index++] = UART_RX_REG; }中断接收需要考虑的几个要点:断帧:这就取决于协议怎么制定了,比如应用协议定义的是ASCII码方式,就可以定义同步头、同步尾,比如AT指令的解析,做逻辑判断帧头、帧尾即可。但是如果传输的是16进制数据,比如MODBUS-RTU其断帧采用的是3.5个字节时间没有新的字节接收到,则认为收到完整的帧了。如何保证帧的完整性,一般会在报文尾部加校验,比较常用的校验模式有CRC校验算法。不同的单片机开发环境对于中断向量的处理方式略有不同,需要根据各自芯片的特点进行处理。比如51单片机,其发送/接收都共享一个中断向量号。
static uint8 rx_index = 0; void uart_rx_isr( void ) { /* 接收报文处理 */ rx_buffer[rx_index++] = UART_RX_REG; }中断接收需要考虑的几个要点:断帧:这就取决于协议怎么制定了,比如应用协议定义的是ASCII码方式,就可以定义同步头、同步尾,比如AT指令的解析,做逻辑判断帧头、帧尾即可。但是如果传输的是16进制数据,比如MODBUS-RTU其断帧采用的是3.5个字节时间没有新的字节接收到,则认为收到完整的帧了。如何保证帧的完整性,一般会在报文尾部加校验,比较常用的校验模式有CRC校验算法。不同的单片机开发环境对于中断向量的处理方式略有不同,需要根据各自芯片的特点进行处理。比如51单片机,其发送/接收都共享一个中断向量号。
#define FRAME_SIZE (128u) static uint8 tx_buffer[FRAME_SIZE]; static uint8 tx_index = 0; static uint8 tx_length = 0; static uint8 rx_buffer[FRAME_SIZE]; static uint8 rx_index = 0; static bool rx_frame_done = false; void prepare_frame( uint8 * pBuf, uint8 size ) { /*将待传的报文按照协议封装*/ /*可能需要处理的事情,比如帧头、帧尾、校验等*/ } bool uart_start_sending( uint8 * pBuf, uint8 size ) { if( pBuf == NULL ) return false; memcpy( tx_buffer,pBuf,size ); tx_index = 0; tx_length = size; /*使能发送中断,向发送寄存器写入一个字节,进入连续发送模式*/ ENABLE_TX_INT = 1; UART_TX_REG = tx_buffer[tx_index++]; } void uart_tx_isr( void ) { if( tx_index<tx_length ) { UART_TX_REG = tx_buffer[tx_index++]; } else { /*发送完毕,关闭发送中断*/ DISABLE_TX_INT = 1; } } void uart_rx_isr( void ) { /*处理接收,待接收到完整的帧就设置帧完成标记*/ /*由于应用各有不同,这里就无法描述实现了*/ }还需要考虑的是,对于UART硬件层面的出错处置,以STM32为例,就可能有下面的错误可能发生:溢出错误噪声检测帧错误奇偶校验错误 另外不同的单片机其底层硬件实现差异也不较大,比如有的硬件发送缓冲是单字节的缓冲,有的则具有FIFO,这些在选型编程时都需要综合考虑。
本版积分规则 发表回复 回帖后跳转到最后一页
39
295
2
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号