一句话,我要疯了,,现在的问题是,使用的串口调试助手来调试的,开发环境从IAR低版本到高版本以及CCS,程序是官方程序和自己编写的,以及网友的。板子是标准板,还有个自己的板子。USB转串口线两条。但是结果都一样。
主要是使用串口调试助手发送字符串,然后接收相同的。结果是,如果我发较长的字符串,前四位会丢失。单个发送字符,根本没有任何返回信息。我简直要疯了,真的不知道原因了,期待大神拯救啊
代码如下:
#include
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P3SEL = BIT3+BIT4; // P3.4,5 = USCI_A0 TXD/RXD
UCA0CTL1 |= UCSWRST; // Put state machine in reset
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 6; // 1MHz 9600 (see User's Guide)
UCA0BR1 = 0; // 1MHz 9600
UCA0MCTL = UCBRS_0 + UCBRF_13 + UCOS16; // Modln UCBRSx=0, UCBRFx=0,
// over sampling
UCA0CTL1 &= ~UCSWRST; // Initialize USCI state machine
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
P4OUT=0;
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, interrupts enabled
__no_operation(); // For debugger
}
// Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCI_A0_VECTOR
interrupt void USCI_A0_ISR(void)
{
switch(even_in_range(UCA0IV,4))
{
case 0:break; // Vector 0 - no interrupt
case 2: // Vector 2 - RXIFG
while (!(UCA0IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
break;
case 4:break; // Vector 4 - TXIFG
default: break;
}
}
这是msp430f5310,串口的初始化流程,都是一个系列的,如果没问题的话估计寄存器都是一样的。仅供参考。
void InitUart(void)
{
//初始化gpio
P4SEL |= 0x30;
P4DIR &= ~0x30;
PMAPKEYID = PMAPKEY;
PMAPCTL = 0x2;
P4MAP45 = 0xB0C;
//----------------------------------------------------------------
//2014/07/20 19:12:47
UCA1CTL1 |= 0x1;//
UCA1CTL0 = 0x0;
UCA1CTL1 |= 0x80;//smclk
//----------------------------------------------------------------
//2014/07/21 11:16:21
//UCOS16 =1表示对输入源频率先进行16分频,然后在与波特率进行计算。
//4M 9600 -->UCBRX = 26,UCBRSX = 0,UCBRFX = 1
////UCBRx = 109, UCBRFx = 0, UCBRSx = 2, UCOS16 = 0
UCA1BR0 = 109;
UCA1BR1 = 0;
// UCOS16 UCBRSx UCBRFx
UCA1MCTL = 4;//1 | (0 << 1) | (0 << 4);
UCA1CTL1 &= ~0x1;//
UCA1IE = 0x1;
}
void put(char c)
{
//If interrupts are not used, poll for flags
if(!(UCA1IE & 0x2))
//Poll for transmit interrupt flag
while(!(UCA1IFG & 0x2));
UCA1TXBUF = c;
}
void puts(char *data,unsigned long len)
{
unsigned long i;
for(i = 0; i < len;i++)
put(data[i]);
}
#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
char rv;
switch(UCA1IV)
{
//Vector 2 - RXIFG
case 2:
rv = UCA1RXBUF;
UCA1TXBUF = rv;
break;
default: break;
}
}
本人上传资源中有嵌入式编程相关的辅助工具,如果有意的可以下载使用,以及arm启动框架的工程,上传的工具和软件根据自己多年的工作经验自己编写的。
当读入的数据长短小于端口最大长度时,那些没有用到的位会被视零。