打印

求助:单片机串行口输出的数据是什么类型?如何用c++读取

[复制链接]
4857|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jxlyyr3|  楼主 | 2011-9-10 09:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的51单片机串行口输出程序如下:
void adtxd(tx_data)   /*串行口输出程序*/
{
ad=tx_data;
SCON= 0x40;                /*串口方式1*/
PCON=0;                     /*SMOD=0*/
//REN=1;                     /*允许接收*/
TMOD=0X20;
TH1=0XE6;
TL1=0XE6;
TR1=1;        /*高八位*/
ad1=ad/256;
SBUF=ad1;
while(!TI);TI=0;
SBUF=ad%256;      /*低八位*/
while(!TI);TI=0;            /*等待发送完毕 */
}

当我用SerialPort类来完成读取串行口的数据的时候,读取的是?号。我的读取及显示函数如下:
m_strEditReceiveMsg += ch;
UpdateData(FALSE);
   所以我想问一下串行口输出的应该不是二进制的数据了吧?要不然怎么会转换成?号了呢?
所以我以为是输出的字符型数据,因此我又用了以下的代码,结果输出的是一个乱码字符,我的程序如下:
m_strEditReceiveMsg += ch;
num1=atoi(m_strEditReceiveMsg);
  itoa(num1,ch1,10);
  GetDlgItem(IDC_EDIT_RECEIVEMSG)->SetWindowText(ch1);

求各位大神指点迷津啊!谢谢了!

相关帖子

沙发
zke2006| | 2011-9-10 17:27 | 只看该作者
用hex格式显示看看

使用特权

评论回复
板凳
NE5532| | 2011-9-10 21:22 | 只看该作者
没啥类型,一堆2进制数据罢了。

使用特权

评论回复
地板
老鱼探戈| | 2011-9-11 02:02 | 只看该作者
要真说类型,就bit了

使用特权

评论回复
5
chengchenz| | 2011-9-11 09:10 | 只看该作者
本帖最后由 chengchenz 于 2011-9-11 09:22 编辑

没看懂LZ想做什么?
是想把从单片机发送的字符串原样显示出来还是想把二进制数据用HEX形式表示出来。
如果是前者,那就不要发送不可显示的字符。
如果是后者,二进制的数据不能就这么显示吧。
LZ是想显示成5E 3D AA DC这种形式吗?
用的MFC?
ch是什么东西?是从串口收到的一个字符吗?

CString hexCh;
hexCh.Format(TEXT("%02X"), ch);
m_strEditReceiveMsg += hexCh;
UpdateData(FALSE);

不过单片机发快了的话,每收一个字符都UpdateData会卡得不行吧。

使用特权

评论回复
6
jxlyyr3|  楼主 | 2011-9-12 10:57 | 只看该作者
非常感谢您的指点,我还想再请教你一个问题,就是如何把这个十六进制数据转换成十进制显示呢。我现在的十六进制显示已经用的是你给我的这个程序了,谢谢了!

5# chengchenz

使用特权

评论回复
7
zhoujiewen| | 2011-9-12 12:51 | 只看该作者
ch是一个二进制数据,想要将这串数据显示成十进制,可以这样:
CString hexCh;
hexCh.Format(TEXT("%d "), ch);
m_strEditReceiveMsg += hexCh;
UpdateData(FALSE);
其实你用串口调试助手,接收到16进制数已经可以了,没必要在转换。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
jxlyyr3 + 1
8
jxlyyr3|  楼主 | 2011-9-12 19:17 | 只看该作者
我按照您所教的方法试了一下,十六进制的时候,显示的是0FF0,改成十进制之后显示的是15240;这个不对吧。
还有一个问题是,我传输进来的是两个八位十六进制数据,因此我应该把两个十六进制的数据转换成一个十进制数据。就是说,把0FF0转换成十进制才是对应的数据。麻烦你再指导我一下,谢谢了!
7# zhoujiewen

使用特权

评论回复
9
zhoujiewen| | 2011-9-13 12:39 | 只看该作者
你把两个接收到得十六进制数合并就行了。比如你将高八位存放在变量Hbyte里面,第八位放在Lbyte里面,再:
  UINT temp ;
   .......
   temp = Hbyte;
   temp = temp << 8;   //高八位
   temp |= Lbyte;         //低八位
   CString hexCh;
   hexCh.Format(TEXT("%d "), temp);
   m_strEditReceiveMsg += hexCh;
   UpdateData(FALSE);

使用特权

评论回复
10
jxlyyr3|  楼主 | 2011-9-13 18:23 | 只看该作者
您好,非常感谢您的指导,现在我已经可以显示数据了,在您的指导下,我的转换显示程序如下:
INT  temp;
// UINT Hbyte,Lbyte;
//INT i=0;
i++;
if (i==1)
{
  Hbyte=ch;
}
if (i==2)
{
  
  Lbyte=ch;
        temp = Hbyte;
        temp = temp << 8;   //高八位
        temp |= Lbyte;         //低八位
        CString hexCh;
        hexCh.Format(TEXT("%.2f "), (temp*10/4095));
        m_strEditReceiveMsg += hexCh;
  i=0;
        
}
UpdateData(FALSE);
  return 0;
可是我还有一个问题。就是我想要显示的数据包含小数点后两位,我现在的程序中,temp为4080,所以转换之后的数据应该是9.96吧,现在显示的是9.00.我不知道应该怎样修改了,谢谢您的指导了! 9# zhoujiewen

使用特权

评论回复
11
zhoujiewen| | 2011-9-14 09:28 | 只看该作者
hexCh.Format(TEXT("%.2f "), (temp*10/4095));
要注意temp是整数不是浮点数,(temp*10/4095)求得的是整数值(这都是很基础的东西哦),你可以改成
hexCh.Format(TEXT("%.2f "), (temp*10/4095.0));

使用特权

评论回复
12
jxlyyr3|  楼主 | 2011-9-19 16:06 | 只看该作者
嗯,谢谢您的指导了!我也知道是很基础的东西。以前没学过c也没学过c++。现在正学着呢,谢谢您的指导了!以后有问题了再来向你请教!谢谢了! 11# zhoujiewen

使用特权

评论回复
13
jxlyyr3|  楼主 | 2011-9-20 14:11 | 只看该作者
您好,我还想请教您一个问题。我想让编辑框中一次只显示一个数据,是不是把m_strEditReceiveMsg += hexCh中的+号去掉就可以了啊。谢谢了! 11# zhoujiewen

使用特权

评论回复
14
zhoujiewen| | 2011-9-21 12:43 | 只看该作者
是这样的,其实这改不改都一样,呵呵。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

45

帖子

1

粉丝