串口与单片机通讯的问题

baiyizhujian 2009-03-12 11:56:09
关于pc串口与单片机通信的问题
我用的是串口类,单片机发送数据给pc接收,
单片机发送数据的编码 和 xp系统接收数据的编码
应该不是一样的吧?

如果它们的字符编码不是一样的话
请告诉我它们的区别

pc串口会自动将它们转换吗



如果 字符编码不是一样的
我pc接收单片机数据的时候,
字符转换有什么需要注意的吗?



...全文
157 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fireway2008 2009-03-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 baiyizhujian 的回复:]
这是串口类中的代码,WPARAM ch类型来的是一个字符还是一个字符串啊 ??
......

在上面 的代码为 发送 单片机发送十进制的数6000
返回的乱码 用十六进制查看返回的1770
[/Quote]
WPARAM ch 是一个自适应的类型,在这个OnCommunication内,ch可以看作是一个字符。
OnCommunication 这个函数是CSerialPort接收数据的核心,无论你传输多大的数据量,它始终是按一个字节 一个字节地进行接收和转换。


一个字节8bit而已,如果是无符号char
即unsigned char,那么范围0~255。

所以,你必须想办法把6000转换成多字节unsigned char进行传输,具体可以用移位的方法或者指针的方法操作。


16bit的数据,2个字节,范围0~65535,应该可以满足你的需要。
计算机内 unsigned shor a16; //16bit
unsigned int b32; //32bit
6000 = 0x1770, 所以你已经在计算机内得到正确的值了。
在计算机内,可以按以下代码处理:
a16 = 0x1770;
unsigned char s[2];
s[0] = a16 & 0x00ff; //得到低8位的数据
s[1] = (a16 & 0xff00)>>8; //得到高8位的数据
xfly0330 2009-03-13
  • 打赏
  • 举报
回复
兄弟你的问题 只有你自己来回答了!
首先可以确定串口是以字节形式发送数据的 你单片机发送的到底是16进制数还是ASC码 只有你自己最清楚啊
分情况转换啊 我刚做了一个串口方面的项目 只提醒你一点 用控件的话波特率的有限制的 直接用API更方便
还有PC接受单片机的数据要将RTS置位 否则接受的数据会有问题!
xmrforever 2009-03-13
  • 打赏
  • 举报
回复
做一个0x30的处理,具体是加还是减,要看你是接收还是发送了
jawiudi 2009-03-13
  • 打赏
  • 举报
回复
一般情况下,发送端发送字符,接收端收到的都是ASCII码,单片机和PC机应该也这样。
下面的处理就看你想让数据按什么方式显示,如果是CString类型,根据ASCII码表转换成CHAR型
baiyizhujian 2009-03-13
  • 打赏
  • 举报
回复
关键是我想把它这些数据返回char类型处理
我该怎么做
baiyizhujian 2009-03-13
  • 打赏
  • 举报
回复
我现在就想得到十进制数6000
我具体该怎么做??
tiger波波 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 baiyizhujian 的回复:]
在上面 的代码为 发送 单片机发送十进制的数6000
返回的乱码 用十六进制查看返回的1770
[/Quote]

单片机返回不对就要看看单片机程序了,接收到的数据是啥就是啥
baiyizhujian 2009-03-13
  • 打赏
  • 举报
回复
在上面 的代码为 发送 单片机发送十进制的数6000
返回的乱码 用十六进制查看返回的1770
baiyizhujian 2009-03-13
  • 打赏
  • 举报
回复

LONG CSCOMMDlg::OnCommunication(WPARAM ch, LPARAM port)
{
/*
if (port <= 0 || port > 4)
return -1;
rxdatacount++; //接收的字节计数
CString strTemp;
strTemp.Format("%ld",rxdatacount);
strTemp="RX:"+strTemp;
m_ctrlRXCOUNT.SetWindowText(strTemp); //显示接收计数

if(m_bStopDispRXData) //如果选择了“停止显示”接收数据,则返回
return -1; //注意,这种情况下,计数仍在继续,只是不显示
//若设置了“自动清空”,则达到50行后,自动清空接收编辑框中显示的数据
if((m_ctrlAutoClear.GetCheck())&&(m_ctrlReceiveData.GetLineCount()>=50))
{
m_ReceiveData.Empty();
UpdateData(FALSE);
}
//如果没有“自动清空”,数据行达到400后,也自动清空
//因为数据过多,影响接收速度,显示是最费CPU时间的操作
if(m_ctrlReceiveData.GetLineCount()>400)
{
m_ReceiveData.Empty();
m_ReceiveData="***The Length of the Text is too long, Emptied Automaticly!!!***\r\n";
UpdateData(FALSE);
}
*/

//如果选择了"十六进制显示",则显示十六进制值
CString str;
// char *p;
if(m_ctrlHexReceieve.GetCheck())
{
str.Format("%02X ",ch);
}
else
{
str.Format("%c",ch);
}

//以下是将接收的字符加在字符串的最后,这里费时很多
//但考虑到数据需要保存成文件,所以没有用List Control
int nLen=m_ctrlReceiveData.GetWindowTextLength();
m_ctrlReceiveData.SetSel(nLen, nLen);
m_ctrlReceiveData.ReplaceSel(str);
nLen+=str.GetLength();

m_ReceiveData=str;
// m_ReceiveData.Empty();

return 0;
}


这是串口类中的代码,WPARAM ch类型来的是一个字符还是一个字符串啊 ??

baiyizhujian 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 Fireway2008 的回复:]
1.单片机发送的数据,你可以参考有关寄存器的设置,一般是8bit地传输,即按字节进行传输,
在计算机内,可以设置一个unsigned char(BYTE) 数组进行接受,分析每一个字符,
如果发送一个ASCII码值>128的字符,处于不可见范围内了,

2.那么在计算机这边,可以定义一个CString str0("");//初始化为空

3.处理接收得到的数据,可以用一个很方便的类CSerialPort。
如果用VC内提供的MSCOMM控件也可以。

例如,从单片机…
[/Quote]

我顶一下
Fireway2008 2009-03-13
  • 打赏
  • 举报
回复
1.单片机发送的数据,你可以参考有关寄存器的设置,一般是8bit地传输,即按字节进行传输,
在计算机内,可以设置一个unsigned char(BYTE) 数组进行接受,分析每一个字符,
如果发送一个ASCII码值>128的字符,处于不可见范围内了,


2.那么在计算机这边,可以定义一个CString str0("");//初始化为空

3.处理接收得到的数据,可以用一个很方便的类CSerialPort。
如果用VC内提供的MSCOMM控件也可以。

例如,从单片机发送一个8bit数据,其ASCII码值为255
计算机的程序通过CSerialPort内的OnComm响应接收
ch = 255;
str0.Format("%02X", ch);//ch是一个unsigned char类型的变量


这样str0 内就存储了"FF"。
wwwhhb4002 2009-03-13
  • 打赏
  • 举报
回复

学习
tiger波波 2009-03-13
  • 打赏
  • 举报
回复
一样的。假如单片机发送ok,以asc码形式,那么他就发送6f 6b,你就接受到6f 6b,接收放到BYTE数组里就可以了
一条晚起的虫 2009-03-13
  • 打赏
  • 举报
回复
lz的问题,只能这样回答:如何转换是由通讯协议决定的。
好好研究下你用到的通讯协议吧。
baiyizhujian 2009-03-13
  • 打赏
  • 举报
回复
把单片机的字符转换成CString类型
wocow3 2009-03-12
  • 打赏
  • 举报
回复
lz的字符转换指的是什么。

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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