0

我正在做一个项目,我需要通过 USART 将数据发送到终端。我需要将数据显示为 char 的数值(0-255)(从 EEPROM 收集

我已经设法将 char 按原样发送到终端(使用 Putty 或 TerMite) 我的问题从 char 的值不可打印的地方开始

这就是为什么我需要将 char 的值转换为数字

示例:当从 EEPROM 获取的数据为 0x31 时,我的例程将发送“1”,但我需要向终端发送“049”或“49”

void SendToSer(void) {

unsigned char Looper;

for (Looper=EEPROM_START;Looper<EEPROM_END;Looper++){
    ReadEEPROM(Looper);    //returns ReadResult
    Write1USART((char) ReadResult); //Sends the ASCII
    ClrWdt();   
}

}

谢谢,

4

2 回答 2

0

谢谢,我决定走很长的路......

这是我所做的是:

将 char 的 int 值操作为 3 个新 char(即)243 变为 3 chars - 50,52,51(数字的 ASCII)

(也许它又长又蹩脚,但它就像一个魅力)

这是脚本....

void ConvertToNumeric(unsigned char IsValue, unsigned int LineNumber){
unsigned int SourceInt;

ClrWdt();
if (IsValue == 1){
    SourceInt = (int) ReadResult;
}else{
    SourceInt = (int) LineNumber;
    LineNumber++;
}

ClrWdt();
switch (SourceInt/100){         
    case 2 :    FirstChar = 50; SourceInt = SourceInt - 200;    break;
    case 1 :    FirstChar = 49; SourceInt = SourceInt - 100;    break;
    case 0:     FirstChar = 48;             break;
}

switch (SourceInt/10){
    case 9 :SecondChar = 57;    SourceInt = SourceInt - 90;         break;
    case 8 :SecondChar = 56;    SourceInt = SourceInt - 80;         break;
    case 7 :SecondChar = 55;    SourceInt = SourceInt - 70;         break;
    case 6 :SecondChar = 54;    SourceInt = SourceInt - 60;         break;
    case 5 :SecondChar = 53;    SourceInt = SourceInt - 50;         break;
    case 4 :SecondChar = 52;    SourceInt = SourceInt - 40;         break;
    case 3 :SecondChar = 51;    SourceInt = SourceInt - 30;         break;
    case 2 :SecondChar = 50;    SourceInt = SourceInt - 20;         break;
    case 1 :SecondChar = 49;    SourceInt = SourceInt - 10;         break;
    case 0 :SecondChar = 48;                                                break;
}

switch (SourceInt){
    case 9:         ThirdChar= 57;          break;
    case 8:         ThirdChar= 56;          break;
    case 7:         ThirdChar= 55;          break;
    case 6:         ThirdChar= 54;          break;
    case 5:         ThirdChar= 53;          break;
    case 4:         ThirdChar= 52;          break;
    case 3:         ThirdChar= 51;          break;
    case 2:         ThirdChar= 50;          break;
    case 1:         ThirdChar= 49;          break;
    case 0:         ThirdChar= 48;          break;  
}

ResultInChars[0] = FirstChar;
ResultInChars[1] = SecondChar;
ResultInChars[2] = ThirdChar;
ResultInChars[3] = '   ';
ResultInChars[4] = NULL;
ResultInChars[5] = NULL;
ResultInChars[6] = NULL;

}

后来我将 puts1USART 与一个包含 3 个以上字符(FirstChar、SecondChar 和 ThirdChar)的数组一起使用

我还在每 4 个值之前添加了一个“lineNumber”,在第四个值之后添加了 CrLf,它导致输出看起来像这样.....

通过串口输出到Putty中的终端

及其工作......

感谢您的帮助

我会接受你的建议,盖伊

于 2016-11-20T13:29:08.467 回答
0

jolati 建议的 sprintf 在某些情况下可能是一匹很好的工作马,或者更好的是 snprintf,如果它适用于您的 C18 版本。这两个例程都遵循标准的 printf 格式(例如https://en.wikipedia.org/wiki/Printf_format_string)。

#include "stdio.h"

void main() {
    char buffer[80];
    unsigned char len, number = 152;

    // Write at most 80 bytes to our buffer
    len = snprintf(buffer, 80, "sprintf string, heres a number: %d", number);
    // buffer now contains our string, len is the number of bytes written

    // or
    len = printf(buffer, "... %d",number);
}
于 2016-11-20T13:10:58.083 回答