Микросхема C18 отправляет данные в терминал в виде числовых
Я работаю над проектом, по которому мне нужно отправить данные через терминал USART. Мне нужно отобразить данные в виде числового значения (0-255) символа (который собран из EEPROM
мне удалось отправить char как есть на терминал (используя Putty или TerMite). Моя проблема начинается там, где значение 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();
}
}
Спасибо,
2 ответа
Спринтф, как предположил Джолати, может быть хорошей рабочей лошадкой в некоторых ситуациях или, что еще лучше, 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);
}
Спасибо, я решил пройти долгий путь......
Вот что я сделал:
Управляемое значение типа char для 3 новых символов (то есть) 243 стало 3 символами - 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;
}
позже я использовал put1USART с массивом, содержащим 3 вышеуказанных символа (FirstChar, SecondChar & ThirdChar)
я также добавил "lineNumber" перед каждыми 4 значениями и CrLf после четвертого значения, и это привело к тому, что вывод выглядит так.....
вывод на терминал в Putty через последовательный порт
и это работает......
Спасибо за вашу помощь
Я хотел бы уточнить ваши предложения, парень