串口编程

清芗芓 2015-05-24 07:35:58
请教VC6.0的串行通讯问题,使用的是MSComm控件,发送控制数据,但从机(变频器)总是收不到,希望高手指点 我使用的MSComm控件,在打开串口,设置完参数后,程序如下:
m_myComm.SetCommPort(3); //选择COM3
if(!m_myComm.GetPortOpen()) //打开串口
m_myComm.SetPortOpen(TRUE);
m_myComm.SetInputMode(1); //设置输入方式为二进制方式
m_myComm.SetSettings("9600,n,8,1"); //设置波特率等参数
m_myComm.Setoutput(colevariant("01030016000165CE"));
这是我编写的程序,5A010302881300000000FB是一组命令,发送后,从机变频器没有响应。(说明书要求命令是十六进制发送)。 我使用串口调试助手,发送同样的命令,选择十六进制发送,从机变频器有响应。
想在我想问的是,m_myComm.Setoutput(colevariant("01030016000165CE"))发送的和串口调试助手发送的命令有什么不同?
怎么编写程序能达到和串口助手发送的命令是一个效果呀[
...全文
135 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
清芗芓 2015-05-25
  • 打赏
  • 举报
回复
CMSComm m_com; if( !m_com.GetPortOpen() ) m_com.SetPortOpen(TRUE);//打开串口 //int Txdata[20]; Txdata[0]=0x01; //从机地址 Txdata[1]=0x03; //功能代码 Txdata[2]=0x00; //起始寄存器的地址 Txdata[3]=0x06; Txdata[4]=0x00; //所读寄存器个数 Txdata[5]=0x01; Txdata[6]=0x64; //CRC校验 Txdata[7]=0x0B; CByteArray OutBuf; OutBuf.RemoveAll(); OutBuf.SetSize(10); //设置大小 int i; for(i = 0; i < 8; i++) { OutBuf.SetAt(i, Txdata[i]); // BYTE转CByteArray,设置第i个位置的数值为Txdata[i] SetAt?设置给定位置上的字符 m_com.SetOutput( COleVariant(OutBuf)); 这是发送部分,不知哪有问题?变频器收不到?跟下位机类型有关吗
Saleayas 2015-05-25
  • 打赏
  • 举报
回复
Variant 要封装十六进制的数组,不是字符串。 使用 Variant 封装 SafeArray,SafeArray 封装你要传输的数组。
笨笨仔 2015-05-24
  • 打赏
  • 举报
回复
不同处应该就是数据类型转换
清芗芓 2015-05-24
  • 打赏
  • 举报
回复
setoutput的数据类型只能是variant类型,不知道变频器能识别吗
清芗芓 2015-05-24
  • 打赏
  • 举报
回复
那它发送的数据类型是16 进制吗,不需要类型转换?
zgl7903 2015-05-24
  • 打赏
  • 举报
回复
用 '\x' 转义符转成16进制,另外需要注意字符串遇到0会截至, 因此用SafeArray比较合适 建议使用API, 兼容性强
洗洗睡去 2015-05-24
  • 打赏
  • 举报
回复
用第三方控件吧 比mscomm简单 http://blog.csdn.net/sunnyloves/article/details/5575995

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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