现在我的串口收发好像都是按照字符的。用的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是一个字。
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是一个字。
char ch[] = {0xEB, 0x90, 0, 0};
CSerialPort.WriteToPort(ch);
要发送十六进制数,不懂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到网上搜一下噢,蛮多资料的
愿早日解决...
CString::Format(_T("%X"),buf[i]);
大小端是指位数在内存摆放的顺序,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传来的,要转向。
m_strSendData="EB90" -> char ch[0]=0xeb; ch[1]=0x90;
m_strSendData="EB90" -> char ch[0]=0xeb; ch[1]=0x90;
{
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');
CString::Format(_T("%02X"),buf[i]);
m_strSendData="EB90" -> char ch[0]=0xeb; ch[1]=0x90;
m_strSendData="EB90" -> char ch[0]=0xeb; ch[1]=0x90;
“EB”=14*16+11=235=0xEB
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;
其他的自己写吧
}
}
}