Other Parts Discussed in Thread: HDC1080
之前检测串口发现1字节接收确实没有问题,现在发现多字节接收怎么有时候会出现错误的字节?例如:PC串口助手发送 96 A5 5A 69给MSP430,发现有时会出现5A变为10的情况出现
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
之前检测串口发现1字节接收确实没有问题,现在发现多字节接收怎么有时候会出现错误的字节?例如:PC串口助手发送 96 A5 5A 69给MSP430,发现有时会出现5A变为10的情况出现
#include "include.h"
#define MAX_STRBUF_SIZE 32 /* 串口接收的最大数据 */
unsigned char g_u32RevCnt = 0; /* 接收字符串自加变量 */
unsigned char gAr32_u8xString[MAX_STRBUF_SIZE]; /* 串口接收字符串数组 */
/*********************************************************************
*函数名称:void Init_GPIO( void )
*函数功能:串口IO初始化
*入口参数:无
*出口参数:无
*备注:无
*********************************************************************/
void Init_GPIO( void )
{
P2DIR = 0xFF;
P2REN = 0xFF;
P2OUT = 0x00;
}
/*********************************************************************
*函数名称:void Transform_Str(unsigned char l_u8Data)
*函数功能:串口发送单字节函数
*入口参数:要发送的数据(l_u8Data)
*出口参数:无
*备注:无
*********************************************************************/
void Transform_Str(unsigned char l_u8Data)
{
while(!(UCA1IFG&UCTXIFG));
UCA1TXBUF = l_u8Data;
}
/*********************************************************************
*函数名称:int putchar(int ch)
*函数功能:putchar重定义函数
*入口参数:无
*出口参数:无
*备注:无
*********************************************************************/
int putchar(int ch)
{
UCA1TXBUF = ch;
while(!(UCA1IFG & UCTXIFG));
return ch;
}
/*********************************************************************
*函数名称:void Usart_Init( void )
*函数功能:串口初始化
*入口参数:无
*出口参数:无
*备注:无
*********************************************************************/
void Usart_Init( void )
{
Init_GPIO();
PM5CTL0 &= ~LOCKLPM5;
FRCTL0 = FRCTLPW | NWAITS_1;
__bis_SR_register(SCG0); // disable FLL
CSCTL3 |= SELREF__REFOCLK; // Set REFO as FLL reference source
CSCTL0 = 0; // clear DCO and MOD registers
CSCTL1 &= ~(DCORSEL_7); // Clear DCO frequency select bits first
CSCTL1 |= DCORSEL_5; // Set DCO = 16MHz
CSCTL2 = FLLD_0 + 487; // DCOCLKDIV = 16MHz
__delay_cycles(3);
__bic_SR_register(SCG0); // enable FLL
while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // FLL locked
CSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK; // set default REFO(~32768Hz) as ACLK source, ACLK = 32768Hz
// default DCOCLKDIV as MCLK and SMCLK source
P2SEL0 |= BIT5 | BIT6;
UCA1CTLW0 |= UCSWRST;
UCA1CTLW0 |= UCSSEL__SMCLK;
// Baud Rate calculation
// 16000000/(16*9600) = 8.681
// Fractional portion = 0.681
// User's Guide Table 14-4: UCBRSx = 0xD6
// UCBRFx = int ( (8.681-8)*16) = 11
UCA1BR0 = 8; // 16000000/16/115200
UCA1BR1 = 0x00;
UCA1MCTLW = 0xD600 | UCOS16 | UCBRF_11;
UCA1CTLW0 &= ~UCSWRST; // Initialize eUSCI
UCA1IE |= UCRXIE; // Enable USCI_A0 RX interrupt
__bis_SR_register(GIE); // interrupts enabled
}
/*********************************************************************
*函数名称:void USCI_A1_ISR(void)
*函数功能:串口接收中断
*入口参数:无
*出口参数:无
*备注:无
*********************************************************************/
#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
switch(__even_in_range(UCA1IV,USCI_UART_UCTXCPTIFG))
{
case USCI_NONE: break;
case USCI_UART_UCRXIFG: // 接收中断
while(!(UCA1IFG & UCTXIFG));
UCA1TXBUF = UCA1RXBUF;
__no_operation();
break;
case USCI_UART_UCTXIFG: break;
case USCI_UART_UCSTTIFG: break;
case USCI_UART_UCTXCPTIFG: break;
default: break;
}
}
我有一个疑问 因为我的工作区内还配置了硬件IIC相关内容,不知硬件IIC的UCTXIFG与串口的UCTXIFG是否会互相影响?虽然前面我加了寄存器前缀(UCB0IFG&UCRXIFG) / (UCA0IFG&UCRXIFG) 但他们同时工时是会互相影响吗?
单从您现在给出的代码,并没有什么问题。能否给出完整工程,我在开发板上试一下
不知硬件IIC的UCTXIFG与串口的UCTXIFG是否会互相影响?
您现在i2c使用的是eUSCI_B?
1、是的 ,i2c使用的是eUSCI_B。
2.、我根据之前您发的链接,参考了一下在中断里尽量不写while类型的函数,现象有所缓解,好像没有出错的现象,第一次发指令也能正常读取我HDC1080内的温湿度,但是关于UCB0RXBUF的读取第二次就会出错,我不知道是不是串口与硬件IIC之间的影响。温湿度读取函数,单独拿出来是没有问题的;
我不知道是不是串口与硬件IIC之间的影响。
这样的话,建议将串口单独拿出来新建工程来测试
请问没有接收完的UCA1RXBUF里的数据如何丢弃或者清空,我发现我规定只接收32字节数据,当发送多余32字节时,发现UCA1RXBUF里剩下的数据还存在,会在下一次发送指令时放在第一位覆盖写入
请问没有接收完的UCA1RXBUF里的数据如何丢弃或者清空
一般来说,BUF每次满了后都会产生中断,用户能读取BUF中的数据。建议尝试下面的方式
case 2: // 中断向量 2 - 接收中断
rxbuff[ rxcount ] = UCA1RXBUF;
rxcount ++ ;
if(( rxcount == 3 ) || (UCA1RXBUF == 0x0D ) )
{
rxflag = 1;
}
中断程序里只缓存数据,当检测到特定字符或者到一定数量之后,置位flag,然后根据这个flag 在主程序里处理 buff的数据。