1、串口工具显示sci发送的字符串乱码(使用 43、42引脚作为接收、发送引脚),串口调试设定为9600 波特率、无校验、8位数据、1位停止位。
2、进行串口通讯测试时,由串口工具发送给 F28379D ,无法正常接收,每次,接收获取到的接收状态均为2。
以上俩问题,困扰我好几天了,麻烦帮我解决一下,谢谢!!
下面附 我的 代码:
//#############################################################################
//
// FILE: sci_simple_echo.c
//
// TITLE: Simple SCI communication with LED control for F28379D
//
//#############################################################################
#include "driverlib.h"
#include "device.h"
#include <string.h>
// 定义LED引脚(D10对应GPIO10)
#define LED_PIN DEVICE_GPIO_PIN_LED1
// 全局变量
char rxBuffer[10];
uint16_t rxIndex = 0;
// 函数声明
void initLED(void);
void blinkLED(uint16_t times);
void delayMs(uint16_t ms);
void main(void)
{
uint16_t receivedChar;
char *msg;
// 初始化设备:PLL、禁用看门狗、使能外设时钟
Device_init();
// 初始化GPIO(禁用引脚锁定、使能内部上拉)
Device_initGPIO();
// 初始化LED
initLED();
// 配置SCI接收引脚(SCIRXDA = GPIO43)
GPIO_setMasterCore(43, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_43_SCIRXDA);
GPIO_setDirectionMode(43, GPIO_DIR_MODE_IN);
GPIO_setPadConfig(43, GPIO_PIN_TYPE_STD |GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode(43, GPIO_QUAL_ASYNC);
// 配置SCI发送引脚(SCITXDA = GPIO42)
GPIO_setMasterCore(42, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_42_SCITXDA);
GPIO_setDirectionMode(42, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(42, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(42, GPIO_QUAL_ASYNC);
// Initialize interrupt controller and vector table.
//
Interrupt_initModule();
Interrupt_initVectorTable();
// 初始化SCI模块(禁用FIFO)
SCI_performSoftwareReset(SCIA_BASE);
SCI_setConfig(SCIA_BASE, 50000000, 9600,
(SCI_CONFIG_WLEN_8 | SCI_CONFIG_STOP_ONE | SCI_CONFIG_PAR_NONE ));
SCI_resetChannels(SCIA_BASE);
SCI_disableFIFO(SCIA_BASE); // 禁用FIFO
SCI_enableModule(SCIA_BASE);
// SCI_setIdleMultiProcessorMode(SCIA_BASE);
#ifdef AUTOBAUD
//
// Perform an autobaud lock.
// SCI expects an 'a' or 'A' to lock the baud rate.
//
SCI_lockAutobaud(SCIA_BASE);
#endif
// 发送初始消息和"300"(满足发送需求)
msg = "\r\nF28379D SCI Test Ready\r\n";
while(*msg != '\0')
{
SCI_writeCharBlockingNonFIFO(SCIA_BASE, *msg++);
}
msg = "300\r\n"; // 发送"300"到串口助手
while(*msg != '\0')
{
SCI_writeCharBlockingNonFIFO(SCIA_BASE, *msg++);
}
// 初始化接收缓冲区
memset(rxBuffer, 0, sizeof(rxBuffer));
rxIndex = 0;
uint16_t rxStatus = 0U;
for(;;)
{
rxStatus = SCI_getRxStatus(SCIA_BASE);
if((rxStatus & SCI_RXSTATUS_ERROR) != 0)
{
ESTOP0;
}
// 检查是否有接收数据
if((rxStatus & SCI_RXSTATUS_READY) != 0)
{
receivedChar = SCI_readCharNonBlocking(SCIA_BASE); // 读取字符
// SCI_writeCharBlockingNonFIFO(SCIA_BASE, receivedChar); // 可选:关闭回显
// 读取后立即获取状态,验证RXWAKE是否清除
uint16_t postStatus = SCI_getRxStatus(SCIA_BASE);
// 存储字符到缓冲区(限制长度)
if(rxIndex < (sizeof(rxBuffer) - 1))
{
rxBuffer[rxIndex++] = (char)receivedChar;
//串口助手发送时 自动 添加 \r\n 换行符
if((receivedChar == '\r') || (receivedChar == '\n') ||
(rxIndex >= (sizeof(rxBuffer) - 1)))
{
rxBuffer[rxIndex] = '\0'; // 字符串终止符
if(strncmp(rxBuffer, "ok", 2) == 0)
{
// 发送确认消息
msg = "\r\nReceived 'ok' - Blinking LED 3 times\r\n";
while(*msg != '\0')
{
SCI_writeCharBlockingNonFIFO(SCIA_BASE, *msg++);
}
// 闪烁LED 3次
blinkLED(3);
// 发送完成消息
msg = "Operation completed\r\n";
while(*msg != '\0')
{
SCI_writeCharBlockingNonFIFO(SCIA_BASE, *msg++);
}
}
// 重置缓冲区(无论是否匹配,都清空以接收新数据)
memset(rxBuffer, 0, sizeof(rxBuffer));
rxIndex = 0;
}
}
else
{
// 缓冲区满时强制重置
memset(rxBuffer, 0, sizeof(rxBuffer));
rxIndex = 0;
}
}
DEVICE_DELAY_US(1000); // 短延时,降低CPU占用
}
}
// 初始化LED引脚
void initLED(void)
{
// 配置D10 LED引脚 (GPIO31)
GPIO_setMasterCore(DEVICE_GPIO_PIN_LED1, GPIO_CORE_CPU1);
GPIO_setPadConfig(DEVICE_GPIO_PIN_LED1, GPIO_PIN_TYPE_STD);
GPIO_setPinConfig(GPIO_31_GPIO31); // GPIO31设为通用IO
GPIO_setDirectionMode(DEVICE_GPIO_PIN_LED1, GPIO_DIR_MODE_OUT);
GPIO_writePin(DEVICE_GPIO_PIN_LED1, 1);
}
// 闪烁LED指定次数
void blinkLED(uint16_t times)
{
uint16_t i; // 将变量i的声明移到for循环外
for(i = 0; i < times; i++)
{
GPIO_writePin(LED_PIN, 0); // 亮
delayMs(200); // 延时200ms
GPIO_writePin(LED_PIN, 1); // 灭
delayMs(200); // 延时200ms
}
}
// 精确延时函数(基于DEVICE_DELAY_US)
void delayMs(uint16_t ms)
{
DEVICE_DELAY_US(ms * 1000); // 利用库函数实现准确毫秒级延时
}