Part Number:MSP430FR2433Other Parts Discussed in Thread:HDC1080
之前检测串口发现1字节接收确实没有问题,现在发现多字节接收怎么有时候会出现错误的字节?例如:PC串口助手发送 96 A5 5A 69给MSP430,发现有时会出现5A变为10的情况出现
Susan Yang:
能否给出相关代码?另外您使用的是开发板配合串口调试助手来调试?
,
user6518570:
#include "include.h"#define MAX_STRBUF_SIZE32 /* 串口接收的最大数据 */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 FLLCSCTL3 |= SELREF__REFOCLK;// Set REFO as FLL reference sourceCSCTL0 = 0;// clear DCO and MOD registersCSCTL1 &= ~(DCORSEL_7);// Clear DCO frequency select bits firstCSCTL1 |= DCORSEL_5;// Set DCO = 16MHzCSCTL2 = FLLD_0 + 487;// DCOCLKDIV = 16MHz__delay_cycles(3);__bic_SR_register(SCG0);// enable FLLwhile(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1));// FLL lockedCSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK;// set default REFO(~32768Hz) as ACLK source, ACLK = 32768Hz// default DCOCLKDIV as MCLK and SMCLK sourceP2SEL0 |= 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) = 11UCA1BR0 = 8;// 16000000/16/115200UCA1BR1 = 0x00;UCA1MCTLW = 0xD600 | UCOS16 | UCBRF_11;UCA1CTLW0 &= ~UCSWRST;// Initialize eUSCIUCA1IE |= 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;} }
,
user6518570:
是的 板子是我自己的 串口调试助手负责发送
,
user6518570:
这是为什么呀?
,
Susan Yang:
我会在之后拿板子测试一下。请您先参考下类似的问题
https://e2echina.ti.com/support/microcontrollers/msp430/f/msp-low-power-microcontroller-forum/107588/msp430-uart
,
user6518570:
好的
,
user6518570:
我有一个疑问 因为我的工作区内还配置了硬件IIC相关内容,不知硬件IIC的UCTXIFG与串口的UCTXIFG是否会互相影响?虽然前面我加了寄存器前缀(UCB0IFG&UCRXIFG) / (UCA0IFG&UCRXIFG) 但他们同时工时是会互相影响吗?
,
Susan Yang:
单从您现在给出的代码,并没有什么问题。能否给出完整工程,我在开发板上试一下
user6518570 说:不知硬件IIC的UCTXIFG与串口的UCTXIFG是否会互相影响?
您现在i2c使用的是eUSCI_B?
,
user6518570:
1、是的 ,i2c使用的是eUSCI_B。
2.、我根据之前您发的链接,参考了一下在中断里尽量不写while类型的函数,现象有所缓解,好像没有出错的现象,第一次发指令也能正常读取我HDC1080内的温湿度,但是关于UCB0RXBUF的读取第二次就会出错,我不知道是不是串口与硬件IIC之间的影响。温湿度读取函数,单独拿出来是没有问题的;
3.3515.MSP_I2C_TEST.zip
,
Susan Yang:
user6518570 说:我不知道是不是串口与硬件IIC之间的影响。
这样的话,建议将串口单独拿出来新建工程来测试
,
user6518570:
请问没有接收完的UCA1RXBUF里的数据如何丢弃或者清空,我发现我规定只接收32字节数据,当发送多余32字节时,发现UCA1RXBUF里剩下的数据还存在,会在下一次发送指令时放在第一位覆盖写入
,
Susan Yang:
user6518570 说:请问没有接收完的UCA1RXBUF里的数据如何丢弃或者清空
一般来说,BUF每次满了后都会产生中断,用户能读取BUF中的数据。建议尝试下面的方式
case 2: // 中断向量 2 - 接收中断 rxbuff[ rxcount ] = UCA1RXBUF; rxcount ++ ; if((rxcount == 3 ) || (UCA1RXBUF == 0x0D ) ) {rxflag = 1; }中断程序里只缓存数据,当检测到特定字符或者到一定数量之后,置位flag,然后根据这个flag 在主程序里处理 buff的数据。