您好!
使用 UART 与 PC 进行通信时、MSP430FR6047存在问题。 我正在 尝试发送具有不同长度的数据并进行回显。
例如、我正在发送 command = bytes ([0x04、0x81、0x01、0xFF、0x2C、 0x01、0x01])作为 komand:B'\x04\x81\x01\xff、\x01\x01'、且接收到的数据为错误 响应:B'\x04\x81\x01、\x01\x01'。
但是、当我只发送2个字节并回显相同的2个字节时、它可以正常工作。 我做错了什么? 我将使用 python 发送命令。 以下是我使用 python 和 MCU 中的代码来发送和接收的代码。
导入序列
导入时间
#定义串行端口设置
com_port ="COM3"
BAUD_RATE = 115200
DATA_BITS = 8
奇偶校验='N'
STOP_BITS = 1
#打开串行端口
SER =串行。 serial (port=com_port、baudrate=b波特 率、bytesize=Data_bits、奇偶校验=奇偶校验、stopbits=stop_bits、 超时=0.5)
DEF READ_RESPONSE ():
Response = ser.read (7)#读取7字节(数据包大小)
返回响应
DEF SEND_COMMAND():
命令=字节([0x04、0x81、0x01、0xFF、0x2C、 0x01、0x01])
print ("komand:"、command)
print ("len:"、len (command))
#发送命令
ser.write (命令)
时间睡眠(0.5)
While True:
#发送命令
send_command()
#读取响应
响应= READ_RESPONSE ()
#打印回复
Print ("响应:"、响应)
MCU 代码
#包含
#包含
//*****
//引脚配置
//*****
静态空 uart_sendByte (uint8_t byte);
#define center_ID 0x04
#define COMMAND_ID 0x80
#define WRITE_CMD 0x01
#define READ_CMD 0x00
#define DATA_SIZE 2
Volatile uint16_t RECEIVED_DATA = 0;
//*****
// UART 初始化文档
//*****
#define SMCLK_115200 0
#define SMCLK_9600 1
#define ACLK_9600 2
#define SMCLK_19200 3
//#define UART_MODE ACLK_9600//SMCLK_115200//
#define UART_MODE SMCLK_115200//
void inituart()
{
//针对 UART 模式配置 USCI_A0
UCA0CTLW0 = UCSWRST;//将 eUSCI 置于复位状态
#if uart_mode == SMCLK_115200
UCA0CTLW0 |= UCSSEL_SMCLK;// CLK = SMCLK
//波特率设置
//使用系列用户指南中的表30-5
UCA0BR0 = 8;
UCA0BR1 = 0;
UCA0MCTLW |= UCOS16 | UCBRF_10 | 0xF700;//0xF700是 UCBRSx = 0xF7
//UCA0MCTLW |= UCOS16 | UCBRF_5 | 0xD600;//0xF700是 UCBRSx = 0xF7
#Elif UART_MODE = SMCLK_9600
UCA0CTLW0 |= UCSSEL_SMCLK;// CLK = SMCLK
//波特率设置
//使用系列用户指南中的表30-5
UCA0BR0 = 3;
UCA0BR1 = 0;
UCA0MCTLW |= UCOS16 | UCBRF_8 | 0xD600;//0xD600是 UCBRSx = 0xD6
#Elif UART_MODE = ACLK_9600
UCA0CTLW0 |= UCSSEL_ACLK;// CLK = ACLK
//波特率计算
// 32768/(9600)= 3.4133
//分数部分= 0.4133
//使用系列用户指南中的表24-5
UCA0BR0 = 3;// 32768/9600
UCA0BR1 = 0;
UCA0MCTLW |= 0x9200;//0x9200为 UCBRSx = 0x92
#Elif UART_MODE = SMCLK_19200
UCA0CTLW0 |= UCSSEL_SMCLK;// CLK = SMCLK
//波特率设置
//使用系列用户指南中的表30-5
UCA0BR0 = 3;
UCA0BR1 = 0;
UCA0MCTLW |= UCOS16 | UCBRF_4 | 0x0200;//0xF700是 UCBRSx = 0xF7
#else
#错误"请指定波特率115200或9600"
#endif
UCA0CTLW0 &=μ~UCSWRST;//初始化 eUSCI
UCA0IE |= UCRXIE;//启用 USCI_A0 RX 中断
}
//*****
//设备初始化
//*****
void initGPIO()
{
//配置 UART
P2SEL0 &=~(BIT0 | BIT1);
P2SEL1 |= BIT0 | BIT1;// USCI_A0 UART 操作
//将 P1.6和 P1.7设置为输出
P1DIR |= BIT6 | BIT7;
//为外部晶体振荡器配置 PJ.5 PJ.4
PJSEL0 |= BIT4 | BIT5;//表示 XT1
PM5CTL0 &=~μ A LOCKLPM5;
}
void initClock45C() 16MHz
{
//根据 MCLK 的器件数据表需要配置一个 FRAM 等待状态
//在配置时钟系统之前8MHz 之外的操作。
FRCTL0 = FRCTLPW | NWAITS_1;
//时钟系统设置
CSCTL0_H = CSKEY_H;//解锁 CS 寄存器
CSCTL1 = DCOFSEL_0;//将 DCO 设置为1MHz
//设置 SMCLK=MCLK=DCO、ACLK=LFXTCLK (如果不可用、则为 VLOCLK)
CSCTL2 = SELM__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;
//每器件勘误表将分频器设置为4,然后再将频率更改为
//防止过冲瞬变导致超出规范操作
CSCTL3 = DIVA_4 | DIVS__4 | DIVM_4;//将所有相应的 clk 源设置为4除以进行勘误
CSCTL1 = DCOFSEL_4 | DCORSEL;//将 DCO 设置为16MHz
//延迟~10us 以使 DCO 稳定。 60个周期= 20个周期缓冲区+(10us /(4MHz))
__delay_cycles (60);
CSCTL3 = DIVA_1 | DIVS__1 | DIVM_1;//将所有分频器设置为1以进行16MHz 操作
CSCTL4 &=~LFXTOFF;
正确
{
CSCTL5 &=~LFXTOFFG;//清除 XT1故障标志
SFRIFG1 &=~OFIFG;
—while (SFRIFG1&OFIFG);//测试振荡器的故障标志
CSCTL0_H = 0;//锁定 CS 寄存器
}
//*****
//主要文件
//如果使用 SMCLK,则进入 LPM0并等待 UART 中断。 如果使用 ACLK *
//然后器件将进入 LPM3模式。 UART RX 中断处理*
//接收到的字符并回显它。 *
//*****
int main (空)
{
uint8_t test1[10]={0};
INT I;
WDTCTL = WDTPW | WDTHOLD;//停止看门狗
initGPIO();
initClock45C(); 16MHz
inituart();
P1OUT &=~BIT6;
P1OUT &=~BIT7;
while (1)
{
P1OUT &=~BIT6;
P1OUT &=~BIT7;
while (! (UCA0IFG & UCRXIFG));
for (I=0;I<6;I++)
{
test1[i]= UCA0RXBUF;
___ delay_cycles(2000);
}
P1OUT |= BIT6;
P1OUT |= BIT7;
while (! (UCA0IFG & UCTXIFG));
for (I=0;I<6;I++)
{
UCA0TXBUF =测试1[i];
___ delay_cycles(2000);
}
}
}