如何以十六进制发送方式向串口发送数据?

yy2001 2002-11-06 06:24:19
不知道大家用没用过"串口调试助手"这个软件,它的以十六进制方式发送,是如何做的?我现在有一个大屏幕,经我测试只有选择了以十六进制方式发送才可以接受到数据,否则同样的数据以字符方式发送就无任何反映,请问如何以十六进制发送方式向串口发送数据?
...全文
6869 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
yy2001 2002-11-08
  • 打赏
  • 举报
回复
invalid(空心菜之冬日晨练)大侠,请到 http://expert.csdn.net/Expert/PostNew.asp?room=5501 领分
jishiping 2002-11-07
  • 打赏
  • 举报
回复
看看你的代码:
char s[5];
s[0]=0xF0;
s[1]=0x10;
s[2]=0x06;
s[3]=0x10;
s[4]=0x04;
s[5]=0x10;
AnsiString text="";
AnsiString caption=text+s[0]+s[1]+s[2]+s[3]+s[4]+s[5];
SerialPort.WriteToPort(caption.c_str());

第一,char s[5];应该是char s[6];
第二,text+s[0]+s[1]+s[2]+s[3]+s[4]+s[5]; AnsiString是不认'\0'
字符的。所以你的'\0'字符,这样永远发送不出去。

因为AnsiString不认'\0'字符,所以不能用AnsiString,只能直接使用
字符数组,就是直接使用s,为什么非要转换成AnsiString呢?同理,函
数WriteToPort也不能使用AnsiString。WriteToPort使用invalid(空心菜
之冬日晨练)说的函数原型。
tony808 2002-11-07
  • 打赏
  • 举报
回复
这个方法我一直用的,我们是用16进制通过串口与外部设备通讯的,你去试试吧
tony808 2002-11-07
  • 打赏
  • 举报
回复
将字符->16进制
DWORD ee;
char * he = "9BBFFA";
ee = _tcstoul((LPSTR)(LPCTSTR)he,NULL,16);
将16->字符
String str;
char *temp;
temp = "\xAB";
str = str.sprintf("%X",*temp);
你去试试吧
invalid 2002-11-07
  • 打赏
  • 举报
回复
void TSerialPort::WriteToPort(char* string,int len) //加上参数。
{
assert(m_hComm != 0);

memset(m_szWriteBuffer, 0, sizeof(m_szWriteBuffer)); //数据长度为12
memcpy(m_szWriteBuffer, string,len);//此处应该要类型强制转换为void *

// set event for write
SetEvent(m_hWriteEvent);
}
而且,你要检查一下,m_hWriteEvent时间处理时,是怎么处理的,是不是也遇到\0就停止了。

注意len不能比sizeof(m_szWriteBuffer))还要大,会溢出的。
invalid 2002-11-07
  • 打赏
  • 举报
回复
不对的。
void TSerialPort::WriteToPort(char* string)
{
assert(m_hComm != 0);

memset(m_szWriteBuffer, 0, sizeof(m_szWriteBuffer)); //数据长度为12
memcpy(m_szWriteBuffer, string,12);//此处应该要类型强制转换为void *

// set event for write
SetEvent(m_hWriteEvent);
}
而且,你要检查一下,m_hWriteEvent时间处理时,是怎么处理的,是不是也遇到\0就停止了。
yy2001 2002-11-07
  • 打赏
  • 举报
回复
invalid:我的函数:
void TSerialPort::WriteToPort(char* string)
{
assert(m_hComm != 0);

memset(m_szWriteBuffer, 0, sizeof(m_szWriteBuffer));
strcpy(m_szWriteBuffer, string);

// set event for write
SetEvent(m_hWriteEvent);
}
我改为:
void TSerialPort::WriteToPort(char* string)
{
assert(m_hComm != 0);

memset(m_szWriteBuffer, 0, sizeof(12)); //数据长度为12
strcpy(m_szWriteBuffer, string);

// set event for write
SetEvent(m_hWriteEvent);
}
是这样吗?不行啊
invalid 2002-11-07
  • 打赏
  • 举报
回复
WriteToPort(caption.c_str());函数的问题,你修改为
WriteToPort(const char *buf,int buflen);
发生指定长度缓冲区的方式,而不是遇到\0就结束的方式。
yy2001 2002-11-07
  • 打赏
  • 举报
回复
我根据串口调试助手的源码中的发送十六进制字符发送
TByteArray hexdata;
AnsiString na="F0 10 06 02 08 09";
int len=StringToHex(na,hexdata); //转换为十六进制数
SerialPort.WriteToPort(hexdata);
还是和我的代码效果一样,F0 10 06 02 08 09这样的数可以正常显示但F0 00 06 02 08 09,这样带0的就不行了。可串口调试助手以十六进制方式发送带0的就可以正常显示,怎么回事?
yy2001 2002-11-07
  • 打赏
  • 举报
回复
我的代码:SerialPort是一个向串口操作类
char s[5];
s[0]=0xF0;
s[1]=0x10;
s[2]=0x06;
s[3]=0x10;
s[4]=0x04;
s[5]=0x10;
AnsiString text="";
AnsiString caption=text+s[0]+s[1]+s[2]+s[3]+s[4]+s[5];
SerialPort.WriteToPort(caption.c_str());
invalid 2002-11-07
  • 打赏
  • 举报
回复
版主来的好早啊!
jishiping 2002-11-07
  • 打赏
  • 举报
回复
“开始位为FO,后跟5位具体数字,我用CHAR类型发送,除0以外均无问题可以正常显示”

我想大家可能还是没有明白你的意思。既然这样你已经做到那样的话,为何不
将你的代码贴出来,让大家帮你分析一下,究竟错在何处。有关串口的设定,
初始化串口的代码,就不用贴出来了。你只需要贴出如何处理数据,发送数据
的部分。
Behard 2002-11-07
  • 打赏
  • 举报
回复
如果还是不行
把代码给我帮你调试
Behard#163.net
(我也要学习他们,把 @ 改为 # 省得一些搜索软件查到后发垃圾)
Behard 2002-11-07
  • 打赏
  • 举报
回复
实际上我的代码真正只是用到了一句

WriteFile(comHandle, buffer, bytesWrite, &written, &ovReadWrite) ;

别的是出错处理的
Behard 2002-11-07
  • 打赏
  • 举报
回复
在发送中指定 长度
也就是把那个函数重载为两个参数

strlen 函数是查找到 '\0' 后就结束的了
yy2001 2002-11-07
  • 打赏
  • 举报
回复
我觉得问题好象出在
strlen((char*)port->m_szWriteBuffer), // Length of message to send
这个参数,我把他改为固定数12,出现0了,但有时显示不对,有时对,但对的时候少,请问应怎么改?
yy2001 2002-11-07
  • 打赏
  • 举报
回复
Behard:
你的代码不全啊,给个能用的啊
Behard 2002-11-07
  • 打赏
  • 举报
回复
看看这个函数吧
哪里需要那么多的呢?
int ComWin32::PutBuffer(char *buffer, int count)
{
COMSTAT queue;
DWORD error;
DWORD written = 0;
int bytesWrite;

ClearCommError(comHandle, &error, &queue);
bytesWrite = txQueue - queue.cbOutQue;//比较缓冲空间
if (count < bytesWrite)
bytesWrite = count;

if (WriteFile(comHandle, buffer, bytesWrite, &written, &ovReadWrite) == 0)
{
if ((error = GetLastError()) == ERROR_IO_PENDING)
ClearCommError(comHandle, &error, &queue);
else
written = bytesWrite;
} /* end of if */

return written;
} // ComWin32::PutBuffer()
yy2001 2002-11-07
  • 打赏
  • 举报
回复
void TSerialPort::WriteChar(TSerialPort* port)
{
BOOL bWrite = true;
BOOL bResult = true;

DWORD BytesSent = 0;

ResetEvent(port->m_hWriteEvent);

// Gain ownership of the critical section
EnterCriticalSection(&port->m_csCommunicationSync);

if (bWrite)
{
// Initailize variables
port->m_ov.Offset = 0;
port->m_ov.OffsetHigh = 0;

// Clear buffer
PurgeComm(port->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);

bResult = WriteFile(port->m_hComm, // Handle to COMM Port
port->m_szWriteBuffer, // Pointer to message buffer in calling function
strlen((char*)port->m_szWriteBuffer), // Length of message to send
&BytesSent,// Where to store the number of bytes sent
&port->m_ov);// Overlapped structure

// deal with any error codes
if (!bResult)
{
DWORD dwError = GetLastError();
switch (dwError)
{
case ERROR_IO_PENDING:
{
// continue to GetOverlappedResults()
BytesSent = 0;
bWrite = false;
break;
}
default:
{
// all other error codes
port->ProcessErrorMessage("WriteFile()");
}
}
}
else
{
LeaveCriticalSection(&port->m_csCommunicationSync);
}
}
// end if(bWrite)

if (!bWrite)
{
bWrite = true;

bResult = GetOverlappedResult(port->m_hComm, // Handle to COM port

&port->m_ov, // Overlapped structure
&BytesSent, // Stores number of bytes sent
true);// Wait flag

LeaveCriticalSection(&port->m_csCommunicationSync);

// deal with the error code
if (!bResult)
{
port->ProcessErrorMessage("GetOverlappedResults() in WriteFile()");

}
} // end if (!bWrite)

// Verify that the data size send equals what we tried to send
if (BytesSent != strlen((char*)port->m_szWriteBuffer))
{
printf("WARNING: WriteFile() error.. Bytes Sent: %d; Message Length:%d\n", BytesSent, strlen((char*)port->m_szWriteBuffer));
}
}
invalid 2002-11-07
  • 打赏
  • 举报
回复
你没有贴出最关键的写端口的代码,应该是调用writefile API的那个函数吧
你可以试试我给你回消息的那个控件,很好用,又专门的论坛讨论的。
加载更多回复(7)

13,870

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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