串口发送出去的数据要以二进制方式,怎么实现

ameliawuxi 2008-09-20 05:35:28
我现在发送字符串类型的数据已经没有问题,但是现在硬件那边需要二进制数据,不知道怎么实现?
我使用API函数编写程序的
...全文
1485 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
iwillbeback008 2009-04-20
  • 打赏
  • 举报
回复
以上代码有瑕疵,也不知道是不是我拷贝时出错,经过我得调试,得到一下正确的函数:


//串口发送数据函数
void CComDiagDlg::SendData(CString strInput)
{
CString strTemp,strClip,strTemp1;
int iLen,i,iCount;
char charInput[100];
BYTE arrSendData[100],byte1[1],byte2[1];
CByteArray Array1;

//strInput+= '\0';
strcpy(charInput,strInput);
iLen=strInput.GetLength();
iCount=0;
for(i=0;i<iLen;i++)
{
switch(charInput[i])
{
case 48: //字符0
case 49: //字符1
case 50: //字符2
case 51: //字符3
case 52: //字符4
case 53: //字符5
case 54: //字符6
case 55: //字符7
case 56: //字符8
case 57: //字符9
case 65: //字符A
case 66: //字符B
case 67: //字符C
case 68: //字符D
case 69: //字符E
case 70: //字符F
{
strTemp+=charInput[i];
if((i+1)%2==0)
{ //将字符串转换为数值
arrSendData[iCount]=(BYTE)strtoul(strTemp,0,16); //strtol
iCount ++;
strTemp="";
}
break;
}
default: break; //其它字符

}

}

Array1.RemoveAll();
Array1.SetSize(iCount);
for(i=0;i<iCount;)
{
Array1.SetAt(i,arrSendData[i]);
i ++;
}
if(Array1.GetSize()>0)
{
myComm.SetOutput(COleVariant(Array1)); //发送数据
}

}
iwillbeback008 2009-04-20
  • 打赏
  • 举报
回复
我最进也在折腾这个,我把龚老师的如何以16进制进行发送的代码贴出来:


void CComDiagDlg::SendData(CString strInput)
{
CString strTemp,strClip,strTemp1;
int iLen,i,iCount;
char charInput[100];
BYTE arrSendData[100];
CByteArray Array1;

strInput+=",";
strcpy(charInput,strInput);
iLen=strInput.GetLength();
iCount=0;
for(i=0;i<iLen;i++)
{
switch(charInput[i])
{
case 48: //字符0
case 49: //字符1
case 50: //字符2
case 51: //字符3
case 52: //字符4
case 53: //字符5
case 54: //字符6
case 55: //字符7
case 56: //字符8
case 57: //字符9
case 65: //字符A
case 66: //字符B
case 67: //字符C
case 68: //字符D
case 69: //字符E
case 70: //字符F
{

strTemp+=charInput[i];
break;
}
default: //其它字符
{
if(strTemp!="")
{
//将字符串转换为数值
arrSendData[iCount]=(BYTE)strtol(strTemp,0,16);
iCount++;
strTemp="";
}
break;
}
}

}
Array1.RemoveAll();
Array1.SetSize(iCount);
for(i=0;i<iCount;i++)
{
Array1.SetAt(i,arrSendData[i]);
}
if(Array1.GetSize()>0)
{
myComm.SetOutput(COleVariant(Array1)); //发送数据
}

}

ameliawuxi 2008-10-08
  • 打赏
  • 举报
回复
问题已经解决了,参考了龚建伟老师关于串口编程的书,里面有如何以16进制进行发送,程序写得很巧妙。
不过还是要谢谢大家,马上散分!
fundawn 2008-09-23
  • 打赏
  • 举报
回复
不是很明白,但是串口应该是可以的呀
打死不掉牙 2008-09-23
  • 打赏
  • 举报
回复
两位两位一取,然后在前面加上0x,那他就是十六进制的数了,再发出去
ameliawuxi 2008-09-23
  • 打赏
  • 举报
回复
我现在将文件中的字符串“123456789A”经过串口发送到另一调试软件进行16进制显示,不是我想要的“12 34 56 78 9A”。
请问大家是不是要把文件中的字符串先转换成16进制存在内存中在进行操作啊,我好像是直接把字符存到内存里面了,具体怎么实现?
ameliawuxi 2008-09-22
  • 打赏
  • 举报
回复
“12 34 56 78 9A”已经是16进制的数了,我现在要求就是硬件接收的时候,能正确显示为“00010010 00110100 01010110 01111000 10011010”
打死不掉牙 2008-09-22
  • 打赏
  • 举报
回复 2
串口接收发送的肯定是二进制的形式啊,硬件上只有高低电平表示数据,只是接收的时候上位机做了处理成能识别的形式,如十进制,字符等等。十六进制0x41,“A”的ASCII码,十进制61在计算机上表示都是一样的,只是表示形式各有不同,所以在串口上传递它都是同一个二进制数,就看你怎么用它了。
就像是同一个人,比如你,在你爸爸面前是儿子,你爷爷面前是孙子,你哥哥面前是弟弟,但是你是不变的,只是在不同的情况下表达的方式不一样而已。
areswry 2008-09-22
  • 打赏
  • 举报
回复
硬件接收到的本来就是二进制了。不知道楼主的意思。
schlafenhamster 2008-09-22
  • 打赏
  • 举报
回复
如果发“12 34 56 78 9A”为10字节,即0x31,0x32....
接受到后每2个字节为一组(如0x31,0x32)转换为一个字节(如0x12),就是数字了.
ameliawuxi 2008-09-22
  • 打赏
  • 举报
回复
刚看到说还要把一开始的字符串“12 34 56 78 9A”作为16进制串转化为一个字符数组,是这样吗?


自己先顶一个!!!
schlafenhamster 2008-09-21
  • 打赏
  • 举报
回复
字符串“123456789A”=0x31,0x32,0x33,0x34...
2进制字串=0x12,0x34,0x56,0x78,0x9A共5个字节.
如果你的串口收发都是用RS232协议,那么发00010010(12)时,不会倒过来接受为0x48(0x12的位倒序).
对RS232只有位串,没什么进制的概念
另外"调试软件以16进制显示接收为30"也不对,如果它受到0x12,那么显示时它要显示0x31,0x32.
ameliawuxi 2008-09-20
  • 打赏
  • 举报
回复
我再详细的描述一下问题:我现在是要把16进制的字符串发送出去,硬件需要接收2进制的数据,我现在发现串口是以ASCII码方式传递的。例如:
16进制字符串“12 34 56 78 9A”我把它转成2进制字符串“00010010 00110100 ...”
现在发现当传送第一个00010010时,它是把第一个0转化成ASCII码48即(00110000)来传递,调试软件以16进制显示接收为30,依此类推!

我要实现的是将一开始需要发送的16进制字符串“12 34 56 78 9A”发送至硬件接口,硬件接收到的是这串字符的2进制形式。
schlafenhamster 2008-09-20
  • 打赏
  • 举报
回复
发出去的全是字节,问题是你怎么看待它,如你发个0x41,你可以把它看成是个字符它就等于"A"(即文本方式),如果你把它看成数字那它就是61(即2二进制方式).再来,如果你要发61这个数的"文本"你必须发2个字节:0x36,0x31.
K行天下 2008-09-20
  • 打赏
  • 举报
回复
发出去的文本 是字节格式 你理解为二进制的也一样
CWADQ 2008-09-20
  • 打赏
  • 举报
回复
不是很明白什么意思?
信念 2008-09-20
  • 打赏
  • 举报
回复
向来怀疑自己的理解能力和别人的表达能力
星羽 2008-09-20
  • 打赏
  • 举报
回复
你是怎么写的
就呆在云上 2008-09-20
  • 打赏
  • 举报
回复
如果是这样的



把数据弄成二进制的萨,应该没有问题萨

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧