|
最近在用STM8s103进行串口通讯调试。
使用UART1,利用中断进行收发,主要代码(中断处理部分)如下- /*发送中断处理代码*/
- @interrupt void USART_TX(void)
- {
- /* 将一个字节写入发送寄存器,并将发送缓冲区指针向后移动一个字节*/
- /*TxBuffer是定义的8字节的字符串,TxCounter是定义的无符号字符变量,用来计数*/
- UART1->DR = TxBuffer[TxCounter++];
- /*如果发送的字节数等于发送缓冲区长度(8字节)*/
- /*BufferSize是常量8*/
- if (TxCounter == BufferSize)
- {
- /* 禁止发送中断 */
- UART1->CR2 &= (~UART1_CR2_TIEN);
- TxCounter = 0;
- }
- return;
- }
- /*接收中断处理代码*/
- @interrupt void USART_RX(void)
- {
- u8 dummy = UART1->SR;
- /*如果状态寄存器标识了接收寄存器中有数据,且接收数据长度小于指定长度*/
- if ( (dummy & 0x20) && (RxCounter < BufferSize) )
- {
- /* 从接收数据寄存器中读取一个字节 */
- RxBuffer[RxCounter++] = UART1->DR;
- }
- else
- {
- if (RxCounter == BufferSize)
- {
- /*当接收的数据长度符合要求时,使能发送中断,进行数据发送*/
- UART1->CR2 |= UART1_CR2_TIEN;
- }
- RxCounter = 0;
- /*禁止接收中断*/
- //UART1->CR2 &= (~UART1_CR2_RIEN);
- }
- return;
- }
复制代码 预期目的:
MCU作为下位机,由电脑(作为主机)串口发送数据给MCU。只要MCU的UART1接收到完整的数据(比如8个字节)后,立即从UART1返回数据(也是8个字节)给发送者,未收到数据时或接收数据不完整均不发送任何数据。主机数据不是连续发送的,但这一帧数据(8个字节)是连续发送的。MCU要侦测是否是完整帧,不是完整帧就丢弃。
问题:
如何保持接收寄存器处于待命状态,等待主机发送指令,为何程序中的dummy&0x20一直有信号,根据STM8s控制器参考手册中说明,读取状态寄存器后再读取接收数据寄存器状态寄存器中的RXNE应该为0,即读取完指定长度的数据后,该位不应该再为1,接收中断处于待命状态,MCU也不会主动发送任何数据.
实际情况:从复位开始要接收到9个字节后才能返回数据,以后每收到1个字节就返回发送缓冲区的所有字节。
备注:
主程序在初始化时完成后,打开了接收中断。
有谁有好的方法达到预期目的吗?还请不吝赐教。
|
|