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.

[参考译文] CCS/MSP430G2553:无法读取串行通信中的所有字符

Guru**** 2551110 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/591628/ccs-msp430g2553-unable-to-read-all-charaters-in-serial-communication

器件型号:MSP430G2553

工具/软件:Code Composer Studio

大家好、

我正在尝试在 PC 和 MSP 之间创建通信、但我仅获得最后一个字符

PC 和 MSP 的波特率均为9600

以下是串行通信的代码:

void InitSerialCommunication ()
{
P1SEL |= RXD + TXD;// P1.1 = RXD、P1.2=TXD
P1SEL2 |= RXD + TXD;// P1.1 = RXD、P1.2=TXD

UCA0CTL1 |= UCSSEL_2;// SMCLK
UCA0BR0 = 0x68
;/ UCB0CTL1 = 0x00
;// UCB9600 UCA0MHZ //调制 UCBRSx = 5
UCA0CTL1 &=~UCSWRST;//**初始化 USCI 状态机**
}

int HasRequest()
{
返回(IFG2 & UCA0RXIFG);
}

void transmit (char* data、int size)
{
while (size > 0)
{
UCA0TXBUF =*DATA+-+;
SIZE
__delay_cycles (delay_char);//需要获取所有字符(如果更改了10个以上的字符或时钟,请考虑增加延迟时间)
}



void receeve (char* data)
{
if (!HasRequest())
return;

*data = UCA0RXBUF;
__delay_cycles (delay_char);
} 
delay_char = 1000 

这里是主代码(我使用 LCD 来查看结果)
#include 

#include "lcd.h"
#include "SerialCommunication.h"
/*
main.c
*/

#define SDA_bit BIT7
#define SCL_bit BIT6
#define LCD_address 0x27
#define WAIT_TIME 255
char key;
#define SIZE_M 5
char R[SIZE_M];
char counter = 0;
void main (void){
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
DCOCTL = 0;//选择最低 DCOx 和 MODx 设置<
BCSCTL1 = CALBC1_1MHz;//设置 DCO
DCOCTL = CALDCO_1MHz;

InitLCD (SDA_bit、SCL_bit、LCD_address);

InitSerialCommunication();

KEY = NONEKEY;

StartLCD();

_enable_interrupt ();
字符地址= 0x80;
while (1)
{

transmit ("hio"、5);
//_delay_cycles (4500);
while (HasRequest())
{
receve (&R[counter++]);
}

if (counter > 0)
{
WriteMsg (R、counter、address、counter);
counter = 0;
}


} 

谢谢大家

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在将下一个字节放入 TXBUF 之前、您不会检查前一个字节是否已完全从 UART 发出。 这样、您将覆盖除最后一个字节之外的所有字节。 您应实施 TX ISR 或检查 TXBUF 空标志。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    正如 ilmars 所建议的、正确的传输方式将是这样的。

    void pheonix _send_data_to_PC (unsigned char * SPS、unsigned char length)

    while (长度)

    while (!(UCA0IFG & UCTXIFG));//将此行添加到您的代码中
    UCA0TXBUF =*SPS;
    长度--;
    SPS++;





    还有一件事是、使用轮询方法进行接收有任何特定的原因? U 可以使用 RX ISR。