我使用的是EXP430F5529,我想实现的功能是蓝牙与板子之间的汉字传输控制。
手机通过蓝牙已经可以和430正常通信。但是只能实现1个字节的通信。
一个汉字有3个字节,每次从UCA1RXBUF读取到的都是最后一个字节。
我知道大概的思路是:接收到一个字符,先存储在数组里,依次接收三个。
只是我不知道应该怎么区分每个字符,因为当触发接收中断以后,UCA1RXBUF里面就只有最后一个字节了。
#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
switch(__even_in_range(UCA1IV,4))
{
case 0:break; // 中断向量 0 – 无中断
case 2: // 中断向量 2 – 接收中断
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = UCA1RXBUF;
data_rx = UCA1RXBUF;
break;
case 4:break; // 中断向量 4 – 发送中断
default: break;
}
}
我用的是Code Composer Studio 6.0.0,目前是初学者。
希望有了解的前辈给我详细一点的解答,谢谢啦。
灰小子:
或者你可以设计一个协议,设置一个特定的字符。当下位机接收到这个特定的字符的时候,后续的三个字符就是一个汉字
,
Maka Luo:
BUF每次满了后都会产生中断,你能读取BUF中的数据。
如果数据出现覆盖是,是你的程序没有及时响应UART中断。
,
zhifang yang1:
1 汉字或者英文ASCII对于 UART来说没有区别,所以你说的“UCA1RXBUF里面就只有最后一个字节了“ 这个现象应该是因为之前的传送的字符没有即时取走造成的。
比如115200 波特率的uart传输,约86us一个字节,如果你整个程序中存在任何执行时间超过86us的中断程序,就会造成UART RX丢数据。
2 中断程序里尽量不要用while 循环,会造成如上所说的中断执行时间过长的问题。
while (!(UCA1IFG&UCTXIFG));UCA1TXBUF = UCA1RXBUF;
这一句的最长执行时间就已经接近86us了。。。
建议:
case 2: // 中断向量 2 - 接收中断 rxbuff[ rxcount ] = UCA1RXBUF; rxcount ++ ; if((rxcount == 3 ) || (UCA1RXBUF == 0x0D ) ) {rxflag = 1; }中断程序里只缓存数据,当检测到特定字符或者到一定数量之后,竖一个flag,然后根据这个flag 在主程序里处理 buff的数据。 这样不易造成数据丢失。
如果你程序中不可避免的有超过86us的中断程序,那么建议用DMA模块,直接将UART RX缓存到内存固定区域。
,
Mathilda Chen:
zhifang yang1 说:
1 汉字或者英文ASCII对于 UART来说没有区别,所以你说的“UCA1RXBUF里面就只有最后一个字节了“ 这个现象应该是因为之前的传送的字符没有即时取走造成的。
比如115200 波特率的uart传输,约86us一个字节,如果你整个程序中存在任何执行时间超过86us的中断程序,就会造成UART RX丢数据。
2 中断程序里尽量不要用while 循环,会造成如上所说的中断执行时间过长的问题。
while (!(UCA1IFG&UCTXIFG));UCA1TXBUF = UCA1RXBUF;
这一句的最长执行时间就已经接近86us了。。。
建议:
case 2: // 中断向量 2 - 接收中断 rxbuff[ rxcount ] = UCA1RXBUF; rxcount ++ ; if((rxcount == 3 ) || (UCA1RXBUF == 0x0D ) ) {rxflag = 1; }中断程序里只缓存数据,当检测到特定字符或者到一定数量之后,竖一个flag,然后根据这个flag 在主程序里处理 buff的数据。 这样不易造成数据丢失。
如果你程序中不可避免的有超过86us的中断程序,那么建议用DMA模块,直接将UART RX缓存到内存固定区域。
,
li dong:
我发现TI自己的UART_READ, 光串口中断的处理时间就花费挺大。。。
波特率高的话就实时不了了
,
Xu Yuchen:
您好,我也是相同的问题,总共需要接收9组字节数组,但是每次都只能接收最后一个。我的中断程序里面没有while循环,请问这是什么原因呢