急!串口按字节收发

sweedy_cool 2009-06-16 05:22:27
现在我的串口收发好像都是按照字符的。用的CSerialPort类。发送函数如下:
void CSerialPort::WriteToPort(LPCTSTR string)
{
assert(m_hComm != 0);

memset(m_szWriteBuffer, 0, sizeof(m_szWriteBuffer));
strcpy(m_szWriteBuffer, string);
m_nWriteSize=strlen(string);

// set event for write
SetEvent(m_hWriteEvent);
}
接收函数如下:WPARAM ch ,是按照什么接收的?
afx_msg LONG OnCommunication(WPARAM ch,LPARAM port);
ON_MESSAGE(WM_COMM_RXCHAR,OnCommunication)
LONG CCE3GROUNDTESTDlg::OnCommunication(WPARAM ch, LPARAM port)
{
}

比如我要发送EB90,我希望实际上发送的是1110 1011 1001 0000。EB是高字节,90是低字节。EB90是一个字。
...全文
229 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2009-06-22
  • 打赏
  • 举报
回复
我不是给你一个程序了,没看?
“EB”=14*16+11=235=0xEB
sweedy_cool 2009-06-22
  • 打赏
  • 举报
回复
比如我在编辑框m_strSendData输入EB90,我怎么把字符串m_strSendData高两个字符EB转成十六进制0xeb,最后两个字符90转成十六进制0x90。
m_strSendData="EB90" -> char ch[0]=0xeb; ch[1]=0x90;
sweedy_cool 2009-06-22
  • 打赏
  • 举报
回复
谢谢各位,我没说太清楚。我希望在编辑框输入CString四个字符,比如EB90,如何将字符串高两个EB组成一个字节也就是11101011存在char ch[0]中,后两个字符串90作为一个字节10010000放在ch[1]中。
m_strSendData="EB90" -> char ch[0]=0xeb; ch[1]=0x90;
WooSir 2009-06-22
  • 打赏
  • 举报
回复
你可以自己写个函数转换。思路如下
void StrToHex(CString str, char buf[2])
{
if (str.GetLength()!=4)
return;
for (int i=0; i<4; i++)
{
char ch = str.GetAt(i));
int x = (i%2==0? 16:1);
switch(ch )
{
case 'f':
case 'F':
buf[i/2] += 15*x;
break;
case 'e':
case 'E':
buf[i/2] += 14*x;
break;
其他的自己写吧
}
}
}
sweedy_cool 2009-06-22
  • 打赏
  • 举报
回复
schlafenhamster,谢谢你,我看了。可是我原来的类型是CString啊,而你给的参数是unsigned char 。m_strSendData是可以随便输入4个字符的,不是固定的
redleaf515 2009-06-20
  • 打赏
  • 举报
回复
for(i = 0; i < nLen; i++)
CString::Format(_T("%02X"),buf[i]);
schlafenhamster 2009-06-20
  • 打赏
  • 举报
回复
int HexValue(unsigned char a)
{
a -= 48;
if(a > 9 ) a -= 7;
return a;
}
//
ch[0]=HexValue('E')*16+HexValue('B');
//
int value=HexValue('E')*4096+HexValue('B')*256+HexValue('9')*16+HexValue('0');

WooSir 2009-06-20
  • 打赏
  • 举报
回复
其实很简单,你的CSerialPort类收发数据为字符,比如,对应发送单字节十六进制数据[1a],它按两个字符'1'和'a'来收发,实际上在WriteFile时发的是0x31和0x61。因此你在收时需要转换收的两个字符'1'和'a'到单字节十六进制数据[1a],发时需要将单字节十六进制数据转换到两个字符
sweedy_cool 2009-06-19
  • 打赏
  • 举报
回复
itoa函数不行啊,我想把CString中的前两个字符组成一个字节放在char ch[]中。
m_strSendData="EB90" -> char ch[0]=0xeb; ch[1]=0x90;
hendriclee 2009-06-19
  • 打赏
  • 举报
回复
貌似可以用itoa函数转换?
sweedy_cool 2009-06-19
  • 打赏
  • 举报
回复
谢谢各位,明白了不少。再问一下关于字符串转成char类型的问题,比如我在编辑框m_strSendData输入EB90,我怎么把字符串m_strSendData高两个字符EB转成十六进制0xeb,最后两个字符90转成十六进制0x90。
m_strSendData="EB90" -> char ch[0]=0xeb; ch[1]=0x90;
ky310 2009-06-17
  • 打赏
  • 举报
回复
接收端是一个一个BYTE接收的,接收顺序跟你发送的顺序一样。

不管是十六进制还是十进制还是字符,发送的时候是按照字节发送的,比如你发送数组Buffer,则按顺序从buffer[0]发送,发送你指定字节的数据。

m_CommPort.WriteToPort(buffer, 10),这样就发送10字节。如果你要按顺序发送EB 90,则按照顺序buffer[n]= 0xEB, buffer[n+1] = 0x90,

想反你就反过来赋值。
tkminigame 2009-06-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sweedy_cool 的回复:]
EB90是一个字!“大小端“是什么意思? 是不是只要把字符转换成16进制数就是按字节发了?
[/Quote]

大小端是指位数在内存摆放的顺序,big endian还是little endian,如果是big endian就是高位在前,反之是低位在前。
比如,一个整数int i = 999。十六进制是3e7 在big endian内存里面是00 00 03 e7,在little endian里面是e7 03 00 00,msdos windows都是little endian。如果你接收的数字是从big endian传来的,要转向。
HellowKitty 2009-06-17
  • 打赏
  • 举报
回复
for(i = 0; i < nLen; i++)
CString::Format(_T("%X"),buf[i]);
sweedy_cool 2009-06-17
  • 打赏
  • 举报
回复
EB90是一个字!“大小端“是什么意思? 是不是只要把字符转换成16进制数就是按字节发了?
schlafenhamster 2009-06-16
  • 打赏
  • 举报
回复
如果EB90是一个字,那要注意“大小端”。
wfuyuan 2009-06-16
  • 打赏
  • 举报
回复
LZ是用多线程写的吧?
要发送十六进制数,不懂LZ是怎么改的
LZ去改一下WriteFile()函数噢

void CSerialDlg::WriteChar(CSerialDlg *port)

{
bResult=WriteFile(port->m_hComm ,port->m_szWriteBuffer ,port->m_nWriteSize ,
&BytesSent,&port->myov );
}
添加stringtohex函数,
发送十六进制数时,要先调用stringtohex函数之后再调用WriteToPort。
具体的LZ到网上搜一下噢,蛮多资料的
愿早日解决...
sweedy_cool 2009-06-16
  • 打赏
  • 举报
回复
vcTiro:发文件的时候我是用二进制文件打开的。发数据的时候好像是字节流吧。再问一下:我把所有的数据转成16进制就可以了吧?但转换以后比如我要发送eb90 1234 5678 09d7,接收端仅显示4Vx。 我编的这个程序跟网上那个串口调试小助手很类似。
sweedy_cool 2009-06-16
  • 打赏
  • 举报
回复
还是不太明白,怎么在我上面的程序中修改阿?
vcTiro 2009-06-16
  • 打赏
  • 举报
回复
“1110 1011 1001 0000” 是字节流还是二进制流?如果是二进制流,直接
char ch[] = {0xEB, 0x90, 0, 0};
CSerialPort.WriteToPort(ch);
加载更多回复(1)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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