显示问题
我从单片机串口发送“12ab” c++builder不是原样显示(我还想显示123 abc)
unsigned char Buf[8192]; //收到的字节数不会超过串口缓存的容量, 所以分配一个缓存容量相同的Buf
int n = YbCommDevice1->Read(Buf,8192); //收到 n 个字节
for(int i=0; i<n; i++)
s += IntToHex(Buf[i],2) + " ";
s = s.Trim();
if(!s.IsEmpty())
Memo1->Lines->Add(s);
显示的是49 50 97 98 各位老师 怎么还原成12ab呀 有函数不?能否给个程序 谢谢了
[解决办法]
单片机串口发送“12ab”你是16进制发送的吗?
你发送的字符,IntToHex(Buf[i],2)转换1(0x31)自然是49;
你可以将Buf[i]强制转换成字符,
[解决办法]
#include <vcl.h>#pragma hdrstop#include <stdio.h> //添加头文件#include "Unit1.h"//---------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TForm1 *Form1;//---------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}//---------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender){ AnsiString str = Edit1->Text;//12ab Edit2->Text = ""; int iLen = str.Length(); AnsiString stp=""; AnsiString sRet=""; for (int i=1;i<=iLen;i++) { int stem = 0; stem = int(str[i]); stp = IntToHex(stem,2); sRet = sRet+stp; } Edit2->Text = sRet.Trim(); char T; int i = sRet.Length(); AnsiString Temp = ""; for(int k = 0;k<i/2;k++) { sscanf((sRet.SubString(k*2+1,2)).c_str(),"%x",&T); Temp = Temp + T; } Edit3->Text = Temp;//恢复 12ab}
[解决办法]
IntToStr已经转成字符类型了。
你自己串口发送过来的是什么进制或者类型不知道?
另外上面的例子自己照样子把他编译运行一下,就明白了。下面这段代码已经帮你把16进制的hex信息还原成了AnsiString.
char T; int i = sRet.Length();//sRet 16进制 AnsiString Temp = "";//恢复结果 for(int k = 0;k<i/2;k++) { sscanf((sRet.SubString(k*2+1,2)).c_str(),"%x",&T); Temp = Temp + T; }