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); // 利用库函数实现准确毫秒级延时}