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.

[参考译文] MSP430F233:某些数据在长时间 UART 传输时丢失

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/601524/msp430f233-some-data-gets-lost-on-long-uart-transmission

器件型号:MSP430F233

您好!

我有一个8Mbit 串行闪存、通过 SPI 连接到 MSP。 闪存用于实时保存测量数据。 所有值均保存为十六进制。

我对一个函数进行编码、以将数据从闪存中获取、并通过 UART 发送到 PC (板载 UART 到 RS232转换器和 RS232到 USB 转换器)。 一般而言、通信没有问题。 如果我所做的就是发送十六进制值、那么一切都很完美。

如果我修改数据使其以 ASCII 格式传输、以便能够直接使用它将其保存在.txt 中并在 Excel 中使用数据、则会出现此问题。 我尝试了2种不同的转换方法:使用 sprintf()或模数运算来分离每个数字。

闪存上有65536数据包。 在将整个闪存填充为数据并使用 HTerm 从 PC 读取数据后、恰好在传输大约40个完全随机的封装期间、MSP 会出现某种断续模式。 在接收端、几乎缺少一个完整的封装。 它只是在早期的下一个封装中继续运行。 这造成大约80个包件有缺陷,这是不可接受的。

由于十六进制传输的工作方式、因此 MSP 修改数据必须存在一些问题。 首先、代码从闪存中检索一个16字节的整包、并将每个字节保存在数组中。

使用 sprintf 转换的代码:

///////////////////////////////////////////////////////////

char dataen[10];
sprintf (dataen、"%d."、flash_ausgelesen_Daten[0]);
uart_print (daten);
sprintf (dataen、"%d."、flash_ausgelesen_Daten[1]);
uart_print (daten);
sprintf (dataen、"%d;"、flash_ausgelesene_Daten[2]);
uart_print (daten);
sprintf (daten、"%d:"、flash_ausgelesene_Daten[3]);
uart_print (daten);
sprintf (dataen、"%d:"、flash_dataen[3];flash_daten_datesen[4]
UART_PRINT (daten);
sprintf (dataen、"%d;"、flash_ausgelesen_Daten[5]);
UART_PRINT (daten);
sprintf (daten、"%d;"、flash_ausgelesen_Daten[6]);
UART_PRINT (daten);
sprintf (dataen、"%d;"、flash_ausgelesene_Daten[7]);
uart_print (dataen);

//此部件转换为整数整数
int Spannung、temperatur、Strom、Druck;
Spannung=(flash_gelesene_Daten[8]<<dataene]+<11_zh_datesene[8]+[gelen_zh_zh_datene]+<en_en_zh_en_en_ene]<11_zh_en_zh_zh_en_en_en_enuesen_ene<1
(temperategelen_en_en_en_en_en_en_en_en_en_en_en_enuesenuesen_en_enuesen_enuesen_en_en_en_enu+<11]<11_zh_enuesenuesenuesenuesen_zh_en_zh_



char spannung[10]、strom[10]、temperatur[10]、druck[10];
sprintf (spannung、"%d;"、Spannung);
sprintf (strom、"%d;"、Strom);
sprintf (Druatur、"%d;"、temperatur);
sprintf (struck、"%d);sprintf (dr);
UART_PRINT (spannung);
UART_PRINT (strom);
UART_PRINT (temperatur);
UART_PRINT (DRACK);
UART_SendByte (0x0A); 

///////////////////////////////////////////////////////////

F233非常小、仅有8kB 闪存和1kB RAM、我非常喜欢它的功能:

MSP430:加载完成。 有7568 (代码)和26 (数据)字节被写入闪存。 预期的 RAM 用量为829字节(未初始化的数据+堆栈)。

可能是 MSP 在处理转换时遇到问题、因此这些问题是否其他人有任何想法?

我们考虑将具有双倍闪存和 RAM 的 F235与下一个电路板一起使用、是否可能不会在大哥身上发生间断?

我希望有人理解我的问题并能帮助我。 我正在尝试通过转换 PC 上的数据来解决问题、但我对 Visual Studio 缺乏技能给了我一些问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的 UART_PRINT/UART_SendByte 函数可能存在问题。 您已对其保密。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    void UART_SendByte (char data)
    {
    WDTCTL = WDTPW + WDTCNTCL;
    while (!(IFG2&UCA0TXIFG));//传输缓冲区准备就绪?
    UCA0TXBUF = DATA;
    }
    
    void UART_PRINT (char *字符串)
    {
    for (;*字符串;string++)//对于每个字节直到字符串末尾
    的{
    UART_SendByte (*字符串);//发送每个字节
    }
    } 

    不要认为这是问题所在。 如果我只是这么做的话、一切都很完美

    for (j=0;j 
    

    我甚至尝试将所有内容发送到 ASCII 修改后的字节中,只使用 UART_SendByte(),但仍然有相同的错误提示。

    我还遇到了一个问题、就是希望 RAM 的使用量稍微多一点(仍然低于900、但仍有1k 可访问的空间)、RAM 中的变量在没有预期的情况下被修改。 我将其追溯到 sprintf()期间发生的时间点,因此我尝试尽可能减少 RAM 的使用量,以消除该问题。

    这就是为什么我认为这是 MSP 无法正常工作的问题。 仅当我修改数据时才会发生这种情况、而这种情况发生在非常罕见的情况下。 所有可能的干扰中断(定时器)也被打开。

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

    RAM 问题可能是由堆栈变得过大引起的(没有针对这种情况的内置保护;当堆栈增长过多时、它只会覆盖其他数据)。 尝试将 sprintf()替换为 itoa()。