COMMI 串口调试软件读取数据
COMMI串口调试软件读取数据
通信采用MODBUS RTU协议,一帧数据格式为:1位起始位+ 8位数据+ 1位停止位
通信采用Modbus通信协议功能代码:
03H——读单个或连续多个寄存器
06H——写单个寄存器
10H——写连续多个寄存器
RTU命令格式及示例
03H——读单个或连续多个寄存器
下传命令:
;
反馈:
; 06H——写单个寄存器
下传命令:
数据阴影部分; 反馈:
10H——写连续多个寄存器下传命令:
2 WORD数据内容阴影部分;
反馈:
用COMMIX串口调试软件读取数据:
在使用前,需先将效验方式选择为“CRC16ModbusRTU”,如图1所示;其余设置参见图2;
图1
读取电机实时状态,比如读取全部96台电机的状态,则可发送命令“01 03 20 00 00 0c”
01:设备地址再起动控制柜地址
03:功能号读单个或连续多个寄存器
2000:实时电机状态1~8号电机寄存器地址
000c:从起始地址为2000H的寄存器读取连续12 WORD的内容;
如图2所示:
图2
发送之后,反馈如图3:运行的电机为9~16号电机,其余电机没有运行
图3。
comassistant串口调试助手使用说明
单片机多功能调试助手简介1简介图1单片机多功能调试助手单片机多功能调试助手一款集串口/USB/网络调试、进制转换、字模与数码管字型码制作、常用校验值计算、UNICODE码转换、位图输出C文件等众多功能于一身的综合型调试软件,最值得庆幸的是该软件会一直保持更新,并支持在线升级功能,这样大家手头上的单片机多功能调试助手总是最新的!单片机多功能调试助手与其他调试软件有什么优势:1)一直保持为单文件状态,不会因为需要保存配置信息而创建其他其他文件,所以该软件非常容易携带。
2)一直体贴着开发者,所有重要的配置在关闭该软件时将会得到保存,重启软件后会重新导入以前的配置信息,免去重复选择或填入数据的操作。
3)集成了串口/USB/网络调试功能,并在串口/USB/网络调试的过程中,该软件提供了监视和多项发送功能。
通过使用监视端口的功能就可以清晰地分辨出发送与接收的数据的顺序;通过使用多项发送功能就可以省去重复删除或填写待发送数据的步骤。
4)在线升级功能是该软件的最得意之处,理所当然地也是开发者最倍受关注的功能。
索取方式:发邮件到wenziqi@或wenziqi@。
2软件预览2.1串口调试图2-1-1串口调试主界面2.1.1串口监视图2-1-2串口监视器点击串口监视器界面的保存记录将会在“单片机多功能调试助手”的根目录生成“串口监视器.txt文件”,如图2-1-3。
图2-1-3串口监视器记录2.1.2多项发送图2-1-4串口多项发送界面2.2USB调试2-2-1USB调试界面2-2-2USB监视器2-2-3USB监视记录2.3网络调试图2-3-1网络调试界面2.3.1TCP监视图2-3-2TCP监视器界面图2-3-3TCP监视记录2.3.2UDP监视图2-3-5UDP监视器图2-3-6UDP监视记录2.4服务器调试图2-4-1服务器界面2.5小工具2-5-18051单片机波特率计算界面2.68051单片机波特率计算2-6-18051单片机波特率计算界面2.7ATMEGA16单片机波特率计算2-7-1ATMEGA16单片机波特率计算界面2.7校验值计算2-7-1校验值计算界面2.8UNICODE2-8-1UNICODE转换界面2.9BMP转C文件图2-9-1BMP2Hex界面图2-9-2BMP转C文件。
读取串口数据
读取串口数据方法一:使用VC++提供的串行通信控件MSComm 首先,在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。
此时,你只需要关心控件提供的对Windows 通讯驱动程序的 API 函数的接口。
换句话说,只需要设置和监视MSComm控件的属性和事件。
在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_Serial),通过该对象便可以对串口属性进行设置,MSComm 控件共有27个属性,这里只介绍其中几个常用属性: CommPort 设置并返回通讯端口号,缺省为COM1。
Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen 设置并返回通讯端口的状态,也可以打开和关闭端口。
Input 从接收缓冲区返回和删除字符。
Output 向发送缓冲区写一个字符串。
InputLen 设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲区中的全部内容。
InBufferCount 返回接收缓冲区中已接收到的字符数,将其置0可以清除接收缓冲区。
InputMode 定义Input属性获取数据的方式(为0:文本方式;为1:二进制方式)。
RThreshold 和 SThreshold 属性,表示在 OnComm 事件发生之前,接收缓冲区或发送缓冲区中可以接收的字符数。
以下是通过设置控件属性对串口进行初始化的实例:BOOL CSampleDlg:: PortOpen(){BOOL m_Opened;......m_Serial.SetCommPort(2); // 指定串口号m_Serial.SetSettings("4800,N,8,1"); // 通信参数设置m_Serial.SetInBufferSize(1024); // 指定接收缓冲区大小m_Serial.SetInBufferCount(0); // 清空接收缓冲区m_Serial.InputMode(1); // 设置数据获取方式m_Serial.SetInputLen(0); // 设置读取方式m_Opened=m_Serail.SetPortOpen(1); // 打开指定的串口return m_Opened;}打开所需串口后,需要考虑串口通信的时机。
串口调试软件使用说明2.0
串口调试软件使用说明首先,运行该软件显示的是一个对话窗。
在该界面的左上角有五个小的下拉窗口,分别为串口,波特率,校验位,数据位,停止位。
串口窗口应为仪表与计算机相连时所使用的串口。
波特率窗口选择仪表设置的波特率。
校验位选择无。
数据位选择8位停止位选择2位在停止位的下面是显示区的选项,选择十六进制显示。
在整个界面的下方是发送区,主要选择十六进制发送,发送方式可选手动发送或自动发送。
其中自动发送可设置发送周期(以毫秒为单位)。
除直接发送代码外本软件也可直接发送文件。
仪表通讯协议如下:通讯格式为8位数据,2个停止位,无校验位。
仪表读写方式如下:读指令:Addr+80H Addr+80H 52H 要读参数的代号写指令:Addr+80H Addr+80H 43H 要写参数的代号写入数低字节写入数高字节读指令的CRC校验码为:52H+Addr 要读参数的代号,Addr为仪表地址参数值范围是0-100。
写指令的CRC校验码为:43H+要写的参数值+Addr 要写的参数代号。
无论是读还是写,仪表都返回以下数据:测量值PV+给定值SV +输出值MV及报警状态+所读/写参数值其中PV、SV及所读参数值均为整数格式,各占2个字节,MV占1个字节,报警状态占1个字节,共8个字节。
每2个8位数据代表一个16位整形数,低位字节在前,高位字节在后,各温度值采用补码表示,热电偶或热电阻输入时其单位都是0.1℃,1V或0V等线性输入时,单位都是线性最小单位。
因为传递的是16位二进制数,所以无法表示小数点,要求用户在上位机处理。
上位机每向仪表发一个指令,仪表在0-0.2秒内作出应答,并返回一个数据,上位机也必须等仪表返回数据后,才能发新的指令,否则将引起错误。
如果仪表超过最大响应时间仍没有应答,则原因可能无效指令、通讯线路故障,仪表没有开机,通讯地址不合等,此时上位机应重发指令。
现以XL4表为例说明首先,将表与计算机的串口一连接。
串口调试助手使用说明
串口调试助手使用说明为简单明了,有些不言自明的功能不作介绍。
1 串口调试助手1.1 设置串口参数:串口号:1-16波特率:600-256000,>115200 时需要硬件支持。
2 接收区/键盘发送区2.1 接收数据a) 设置串口参数b) 如果要按十六进制形式显示接收数据,将十六进制显示选项选中。
c) 点击打开/关闭串口区中的打开串口按钮。
2.2 显示接收数据的长度因某些限制,显示接收数据的文本不能太长,所以当显示文本长度快达到62K 时会自动将显示文本删减到32K,此时文本可保留32K 的字符或约10K 的十六进制数据显示。
2.3 在键盘上发送英文字符a)在接收区/键盘发送区的输入框中用鼠标点一下。
b)在键盘按下按键立刻发送。
在这里不能发送回车换行,也不能发送汉字,若要发送请在单字符串发送区发送。
3 发送数据可以发送单字符串,多字符串(字符串序列)或直接在键盘上发送英文字符。
有两种发送数据格式,一种是普通的字符串,另外一种是十六进制数据即HEX 格式数据。
发送HEX 格式数据时要在字符串输入区中输入HEX 格式字符串,并且要将相应区内的十六进制发送选项选中。
例:HEX 格式数据字符串12 34 AB CD FF3.1 单字符串发送区3.1.1自动发送,自动发送周期:此项功能可以每隔一段时间反复地自动发送输入框中的数据,点击自动发送按钮后即启动自动发送功能。
自动发送周期最大为65535mS。
3.2 多字符串发送区在多字符串发送区可以发送一个字符串,或者自动地、依次发送所有的字符串。
请把鼠标移到“接收区/键盘发送区”和“多字符串发送区”之间,当鼠标形状发生变化时按下鼠标器的左键不松开,然后移动鼠标,将“多字符串发送区”的宽度调宽一些,让“间隔时间”显露出来。
3.2.1发送一个字符串a) 输入字符串。
b) 如果要发送16 进制数据, 要先在字符串后的HEX 选项框中打上对勾。
c) 点击发送按钮。
Commix工业控制串口调试工具V1.4功能介绍
Commix工业控制串口调试工具V1.4功能介绍Commix 工业控制串口调试工具 V1.4
为工业控制设计的串口设备调试工具,已被许多同行使用,主要特点:
1、能根据设备的通讯协议,方便地生成多种冗余校验如Modbus,并加上结束符,适用于大多数串口通讯的工业设备;
2、能够混合输入16进制数、10进制数、ASCII字符,这种功能通过转义符“\\\\”实现;
3、支持串口1~255,支持各种虚拟串口,可以自定义任意通讯参数组合,随时改变参数而不用关闭串口,支持不常用的波特率等;
4、可以测出设备的响应间隔;
5、通讯数据可保存到RTF文件,参数设置可保存到注册表reg文件。
6、可切换中文/英文显示。
C_串口操作之读取串口数据
{
mPort = 1i;
axMSComm2.InputMode =
InputModeBinary;
//用于设置或返回传输数据的类型,
int.Parse(ReceivedData[i + 2].ToString("X"));
}
}
ReceiveDataNum = 0;
UnsettledDataNum = 0;
}
二、C#串口操作之发送数据
try
{
mPort = zifuchuankou;
//这里注意MSComm.Input返回的是一个object的类型,
//所以必须使用显式的类型转换
CommBufferData = (byte[])objIn;
//CommBufferData为串口缓冲区内所有数据
//存取最后一次接收到的缓冲区的数据,
//存储部分时作为后期数据处理所用,
byte[] CommBufferData = new byte[1024];
byte[] ComByte = new byte[8];
BufferDataNumStart = axMSComm2.InBufferCount; ;
//将缓冲区内等待读取的字节个数赋给BufferDataNumStart
{
MessageBox.Show(e.ToString());
}
在axMSComm的OnComm事件里写:
private void axMSComm2_OnComm(object sender, EventArgs e)
{
switch (mEvent) //查询CommEvent属性
ComMonitor捷通串口调试软件使用手册6
ComMonitor捷通串口调试软件使用说明书(6)捷通模拟通讯实验室Email:***************捷通模拟通讯实验室二零零九年十一月目录一、介绍 (2)二、软件界面 (2)2.1 软件主界面 (2)2.2 最大化界面 (3)2.3窗口置顶 (4)三、显示区控制 (6)3.1显示发送 (6)3.2帧换行 (6)3.3显示保存发送和接收时间 (7)3.4关键字过滤 (8)3.5 保存显示区内容 (8)四、发送区数据发送控制 (10)4.1 发送区数据格式说明 (10)4.2手动控制 (10)4.3自动发送 (11)4.4 校验码计算 (11)五、轮发功能 (13)5.1 发送区轮发 (13)5.2文件轮发 (13)5.3定时轮发 (15)5.4 帧回应轮发 (15)六、常见问题索引 (18)6.1 串口不能打开 (18)6.2 接收到的数据不对 (18)6.3 接收区没有显示 (18)6.4 自动发送为什么没有发送数据 (18)6.5 如何获得最新的ComMonitor软件 (18)6.6 关于ComMonitor软件源代码 (18)一、介绍ComMonitor捷通串口调试软件追求的是方便易用,能调试大多数的串口通讯应用。
本软件参考了串口调试助手,但又根据自己多年的工作经验,添加了更多的实用功能。
具体来讲,它除了具备一般的串口调试工具的功能以外,还具有以下特别之处:1、支持多达20个串口,对于使用多串口卡或虚拟串口的用户是很必要的;2、加入了接收显示与保存的关键字过滤功能;3、具备接收显示与保存时帧换行功能,40ms未受到数据,认为一帧结束;4、具有记录发送和接收时间的功能;5、支持3个独立的发送区;6、3个发送区可以以定时或响应等两种方式进行轮发;7、具有计算CRC16、CRC8等校验码的功能;8、自动保存上一次使用的端口配置;9、自动保存上一次发送区的数据;10、具有文件按行发送轮发功能,发送方式也可以采用定时和响应两种方式;11、轮发响应方式中,加入了超时判断,和自定义多次重发功能;12、所有参数和数据支持运行时改变,不需要重新启动;13、轮发时可以选择只轮发一遍,还是不断轮发;14、收发报文用不同的颜色显示,红的为接收,篮的为发送;ComMonitor捷通串口调试软件设计开始就是针对调试串口设备通讯的。
(串口通信编程)开源串口调试助手Common(ComMonitor)
(串⼝通信编程)开源串⼝调试助⼿Common(ComMonitor) 最新的⽂档见这⾥: 我写的串⼝调试助⼿程序以及源代码. 警告:请勿将本软件源代码⽤于任何商业⽤途。
其实吧, 我写的这个串⼝软件绝对⽐⽹上流传的⼀些串⼝调试软件好⽤很多, 对于软件,我本⾝并没有作 太多推⼴, ⼀些功能我由于懒也没有⽂档化; 如果您正在使⽤, 也觉得我说得没错, 还望您帮忙推⼴⼀下. 感激!本程序最近正在使⽤C++完全重构, github上⾯的源代码⽆法通过编译~~ 敬请期待最新版本!微云你就⼀坑货, 说了的链接永久有效呢?源代码: 声明:本软件为开源软件,绝对不包含任何对系统不利的代码,对于360的那种⾏为,我不想说什么. 软件界⾯:-------------------------------------------------------------------------------------------------------------------------说明: 更新信息可能不会再更新到这⾥, 请到上⾯查看. 更新:2014-07-07:①优化:接收数据时,如果最后⼀个字符是'\r'或'\n',则会在⼀定时间内等待接收所有'\r','\n'字符,避免导致读取'\r\n'可能造成的两次换⾏②更改:除已经提到的那三种情况, 还有使⽤'\r\n\r'三个字符作为换⾏符使⽤的, 已增加⽀持2014-07-07:①修复:回车换⾏字符'\r','\n','\r\n'均能达到换⾏效果②修复:⼀开始"忽略回车"等⽆法点击问题③优化:简化对数据中包含'\0'的数据的处理④增加:简洁界⾯模式时把⼯具栏放到左边⑤更改:只显⽰接收区按下的"回车"字符为"<Enter>",其它不显⽰⑥增加:接收区增加⼀个"清空数据"菜单2014-07-06 1.17:①增加:允许从接收区输⼊字符并发送(更友好的类交互模式) 会显⽰的字符包括: ' ' <Space> '\b' <Backspace> '\t' <Tab> '\r' <Enter> 感觉输⼊效果还不错:②更改:更改了字符接收区/发送区的字体为Consolas等宽字体,不再使⽤原来的Courier字体③增加:简洁模式 - 此模式下⼤部分界⾯元素会被隐藏, 有时候这样更舒服 见上图所⽰, 左下⾓为"简洁模式"开关, 开启简洁模式后就像上图, 是不是很简洁?④增加:主窗⼝的⾃动界⾯布局(允许拖动改变窗⼝⼤⼩,控件坐标⾃动调整)⑤更改:默认使⽤的模式改为:字符接收+字符发送2014-07-05 1.16 (未对外发布):①字符接收数据时,增加对控制字符Backspace的⽀持(即'\b'),效果就是向前删除⼀个字符②修复⼀处中⽂检测错误(原来是对的, 不知道什么时候改错了③删除了窗体⼤⼩调整(下个版本即将使⽤⾃动布局)2014-03-03 1.15: 更新:⽀持⼿动输⼊⾮标准波特率 改进:增加了⼏个功能快捷键,⽐如Alt+S为发送,.... 优化:修正:如果接收缓冲区有未显⽰的数据,则会在按下继续显⽰时进⾏提⽰,⽽不是原来的在接收到下⼀次的数据时进⾏提⽰; 2013-11-02 1.14: 更新:修改了原来的命令发送模式的界⾯,现在变得更加友好了 如下图, 先选择要发送的命令列表⽂件: 点击打开, 将会打开如下界⾯: 1.上⾯的代码是我测试蓝⽛芯⽚⽤到的命令列表⽂件, 点击"发送命令"就会发送对应的⼀条命令 2.16进制还是原来的要求, 2个⼀组即可; 对于字符数据:默认开启转义字符功能, ⽐如 '\n' 就代表换⾏, ⽀持字符型转义字符有6个, \n,\r,\\,\t,\a,\v,\b, 那些可见的字符不需要转义, ⽐如引号,问号... ⽀持的16进制转义字符格式:\x?? - 其中, ⼀个?代表⼀个16进制字符, 以上4个字符组成⼀个16进制值,缺⼀不可 3.⽂本框中的数据可以在发送时随时修改,回车键可看到效果, (但修改的内容⽬前不能更新到原来的本地⽂件上) 4.注意到数据类型后⾯的"双击改变"⼏个字样, 也就是说通过双击, 可以改变那条命令的解析格式 5.数据⼤⼩是指最终要被发送的数据的⼤⼩, ⽽不是转义前的⼤⼩ 命令⽂件的格式举例: C:初始化SPP库:at+init\r\n C:查询任意访问码的蓝⽛设备:at+iac=9e8b33\r\n C:查询设备类为0x1f1f的蓝⽛设备:at+class=1f1f\r\n C:设置查询模式:at+inqm=1,9,48\r\n C:过滤,查询周边蓝⽛设备:at+inq\r\n H:16进制测试:12 45 67 4f 分为3部分组成, 两者之间⽤冒号隔开: 第1部分:C或者H(⼤写), 代表数据是16进制还是字符数据 第2部分:命令的名字 第3部分:数据对应的数据 BUG修复: 上⼀个版本在发送数据前忘记检查串⼝是否已经打开了, 已修复~----------------------------------------------------------------------------------------------------------2012-12-24 1.0.0.0:发布第1个版本2012-12-26:⾃动识别当前存在,插⼊,移除的串⼝号2013-01-11 1.0.0.1:增加保存接收区数据到⽂件(16进制/⽂本形式)增加从⽂件读数据到发送区(16进制/⽂本形式)增加暂停显⽰功能增加复制发送/接收区数据到剪贴板2013-01-18 1.0.0.2:修复:⽂本⽂件,16⼆进制⽂件读取错误修复:程序内部缓冲区满后使程序进⼊死循环修复:⽂本字符⽅式显⽰接收的数据时产⽣不正确的换⾏符的错误,若要产⽣换⾏符, 请使⽤"\n"2013-02-08 1.0.0.3:内部程序作了许多的优化⼯作,包含数据的发送⽅式等修复接收数据时⿏标在接收区的⽂本选择造成的⼲扰2013-02-14 1.0.0.4:增加显⽰出0~127号ASCII对应8,10,16进制功能2013-02-24 1.0.0.5,今天元宵节:更改原来的1~64串⼝列表到⾃动检测计算机上的可⽤串⼝2013-02-27 1.0.0.6:若发送⽂本,则⾃动发送被⾃动取消(若⾃动发送选项已打开)在显⽰模式下不允许对接收区数据进⾏选择操作提供硬件⽀持的串⼝设备设置为⽤户提供串⼝超时设置提供⼿动设置DTR/RTS引脚电平2013-03-01 1.0.0.7:修改原计算器(系统)为表达式求值计算器(简单版本)2013-03-03:添加:<其它>菜单添加<设备管理器>修改:在关闭串⼝后⾃动发送前⾯的钩不再⾃动取消(如果已经选中)修改:串⼝被关闭/移除后串⼝列表回到第⼀个串⼝设备的BUG2013-03-04:修改:现在在串⼝列表中可以显⽰串⼝在设备管理器中的名字了修正:⽆法显⽰ MSP430-FETUIF Debugger 的串⼝号(现在调⽤SetupApi更新列表)2013-03-05:为了⽅便数据的统计与显⽰,16进制内容与字符内容被显⽰到不同的编辑框中2013-03-09 1.0.0.8:修正在使⽤SetupApi枚举串⼝设备时未检测并⼝设备⽽造成的内存异常访问错误减少在某些波特率(如:19200bps)下丢包严重的情况(如:MSP430串⼝),有时候还是会发⽣,等待修复.某些软件(如:SComAssistant采⽤每次只读⼀个字节的办法效果还⾏, 就是速度有点慢. 我改成了WaitCommEvent函数调⽤了(原来是Pending ReadFile),减少了CPU占⽤(有些串⼝驱动并不总是⽀持同步操作.以前只管ReadFile+输出nRead字节,这⾥错误,ReadFile并不保证读取到要求的数据量后才返回,这⾥会导致严重丢包,WriteFile亦然.速度减慢,但数据更完整2013-03-10 1.0.0.9:修正:因为在格式化字符串的最后少写了⼀句 *pb = '\0',导致接收区数据显⽰错误! 修复:对utils.hex2chs和add_text作了⼤量修改,⼤⼤减少数据丢包,貌似没有丢包?,细节处理参见源程序 1.0.0.8版本因为内部原因速度严重减慢, 1.0.0.9回到原来的快速!2013-03-18:更正:若为字符显⽰⽅式,16进制⽅式保存不被允许,因为格式基本上不满⾜!2013-03-23 1.10:添加:⼯作模式中,右键点击接收区字符⽂本框可以使能中⽂显⽰模式(不推荐),由于中⽂字符由两个字节构成,所以:⼀旦在某⼀次接收过程中只接收到了中⽂字符的⼀个字节,那么数据就会显⽰出错, 这个⽆法避免, 所以建议尽量不使能中⽂显⽰模式.修正:⽤C语⾔的⼈们都习惯使⽤'\n'作为换⾏符,我也这样使⽤,但偏偏Windows的编辑框以'\r\n'作为换⾏符,没有办法,我不得不把所有的'\n'换成'\r\n',效率必然会下降,⽽且我不得不计算出\n的个数先 --> 为了计算所需缓冲区的⼤⼩.添加:现在可以显⽰出还未被发送出去的数据计数.添加:新增计时器,打开串⼝后开始计时,关闭后停⽌计时.2013-03-25:修正:⼤⼤减少中⽂乱码的问题.细节处理见代码.增加:字符串转16进制数组功能,⼯具菜单⾥⾯.2013-04-04:修正:⽆法复制接收区字符⽂本的BUG.⼩提⽰:在选择串⼝时,如果没有任何可⽤的串⼝,则进⾏提⽰更新.2013-04-07:修改:完全修改了utils.str2hex的实现,⼤⼤增加了16进制输⼊的灵活性.现在的要求:每个16进制值由两个相邻字符组成,⽆其它限制.(以前是2个相邻字符+⼀个空格)2013-04-11:发送字符数据时,对于换⾏,只发送'\n',不再发送'\r\n',注意:结尾的'\0\'不被发送!2013-04-13:修正:更改发送与接收⽅式为异步⽅式.添加:简单波形显⽰.2013-04-23:修正:发送与接收⽅式改回同步⽅式!坑~修正:当发送操作达到100次时⽆法继续发送的BUG!修改:优化内部线程同步机制,避免程序停⽌⼯作(失去响应)!优化:优化⾃动发送数据的⽅式,提⾼精度,减⼩内存/CPU占⽤!⼩提⽰:在加载/保存⽂件时,若不清楚打开/保存⽅式,可以查看简单的帮助信息!2013-05-11:明天母亲节修正:终于找到⼀个⽐较好的办法来处理⾃动发送⽤到的重复数据了,呵呵,时间下限减少到10ms2013-07-05:临时修正:选择从⽂件加载并取消后, 串⼝号选择的ComboBox会消失不见,不知道原因,临时已解决2013-07-14:改进:程序内部改进内存分配算法,避免因程序错误造成内存泄漏2013-07-20 1.12:2013-09-10 1.13 今天教师节:增加:现在可以⼿动编写待发送的命令⽂件,并发送命令了 - 在发送⽂件时选择命令⽂件, 格式见博客后⾯的介绍增加:字符发送模式下,可以选择取消回车换⾏符的发送,可以选择插⼊转义字符 1.⽀持的字符型转义字符:\r,\n,\t,\v,\a,\b,\\2.⽀持的16进制转义字符格式:\x?? - 其中⼀个问号代表⼀个16进制字符, 不可省略其⼀,必需保证4个字符的格式3.'?',''','"', 等print-able字符不需要转义 ⼥孩不哭 @ 2012-12-27 14:47:59 @。
MSCOMM串口控件数据接收方式
MSCOMM串口控件数据接收方式MSCOMM串口控件数据接收方式1、在OnComm 事件中接收数据:这种方式能充分MSCOMM控件的特性。
OnComm 事件还可以检查和处理通讯错误;可以通过检查 CommEvent 属性的值来查询事件和错误;对于不定长数据以及对数据进行处理比较复杂的情况,此法不是很方便。
Private Sub MSComm_OnComm ()Select Case mEvent' 错误Case comEventBreak ' 收到 Break。
Case comEventCDTO ' CD (RLSD) 超时。
Case comEventCTSTO ' CTS Timeout。
Case comEventDSRTO ' DSR Timeout。
Case comEventFrame ' Framing ErrorCase comEventOverrun '数据丢失。
Case comEventRxOver'接收缓冲区溢出。
Case comEventRxParity' Parity 错误。
Case comEventTxFull '传输缓冲区已满。
Case comEventDCB '获取 DCB] 时意外错误' 事件Case comEvCD ' CD 线状态变化。
Case comEvCTS ' CTS 线状态变化。
Case comEvDSR ' DSR 线状态变化。
Case comEvRing ' Ring Indicator 变化。
Case comEvReceive ' 收到 RThreshold # of chars.Case comEvSend ' 传输缓冲区有 Sthreshold 个字符 'Case comEvEof ' 输入数据流中发现 EOF 字符End SelectEnd Sub2.轮循法采集数据:A、定时器轮循法对于数据包方式收发数据以及不需即时响应情况,用轮循法更好些。
不断读取串口MSCommlInput数据
CommPort 设置或返回通信端口号
Settings Байду номын сангаас字符串的形式设置或返回波特率、奇偶校验、数据位和停止位
PortOpen 设置或返回通信端口的状态。也可以打开和关闭端口
Input 返回和删除接收缓冲区中的字符
Output 将字符串写入发送缓冲区
CommEvent属性为通信事件或错误返回下列值之一。在该控件的对象库中也可以找到这些常量。
Input 返回和删除接收缓冲区中的字符
Output 将字符串写入发送缓冲区
CommEvent属性为通信事件或错误返回下列值之一。在该控件的对象库中也可以找到这些常量。
常量 值 描述
ComEventBreak 1001 收到了断开信号
ComEventCTSTO 1002 Clear To Send Timeout。在发送字符时,在系统指定的事1件内,CTS(Clear To Send)线是低电平
ComEventRxOver 1008 接收缓冲区溢出。在接收缓冲区中没有空间
ComEventRxParity 1009 奇偶校验错。硬件检测到奇偶校验错误7
ComEventTxFull 1010 发送缓冲区满。在对发送字符排队时,发送缓冲区满
ComEventDCB 1011 检取端口DCB(Device Control Blick)时发生了没有预料到的错误
ComEventFrame 1004 数据帧错误。硬件检测到一个数据帧错误
ComEventOverrun 1006 端口溢出。硬件中的字符尚未读,下一个字符又到达,并且丢失
ComEventCDTO 1007 Carrier Detect Time。在发送字符时,在系统指定的事件内,CD(Carrier Detect)线是低电平。CD也称为RLSD(Receive Line Singal Detect,接收线信号检测)
pcommlite串口通讯库使用
pcommlite串⼝通讯库使⽤MFC下串⼝编程使⽤最多的两种⽅法是读取注册表和使⽤mscomm组件,都有着或多或少的缺陷,调⽤系统SDK⽐较⿇烦,⽽MSCOMm组件最多⽀持16个串⼝,串⼝号⼤于16的时候⽆法打开,遇到这种情况,可以使⽤⼀个名为pcommlite的串⼝通讯库,下载安装之后,解压出来的⽂件包括根据编译的平台选择相应的lib⽂件加⼊⼯程,并加⼊pcomm.h⽂件1. 寻找系统串⼝,sio_open()打开串⼝ sio_close()关闭串⼝2. BYTE i = 0;3. CString str;4. // TODO: 在此添加控件通知处理程序代码5. ((CComboBox *)this->GetDlgItem(IDC_COMBO_Serial_Num_Select))->ResetContent();6. for (i = 0;i < 255;i++)7. {//此程序⽀持255个串⼝8. if(SIO_OK == sio_open(i))9. {10. sio_close(i);11. str.AppendFormat("COM%d",i);12. ((CComboBox *)GetDlgItem(IDC_COMBO_Serial_Num_Select))->AddString(str);13. str.Empty();14. }15. }16. i = ((CComboBox *)GetDlgItem(IDC_COMBO_Serial_Num_Select))->GetCount();17. if(i ==0)18. {19. GetDlgItem(IDC_BUTTON_SERIAL_CONTROL)->EnableWindow(FALSE);20. }21. else22. {23. GetDlgItem(IDC_BUTTON_SERIAL_CONTROL)->EnableWindow(TRUE);24. }2.打开串⼝,各种库宏定义switch(comBaud){case 0:m_comBaud = B1200;break;case 1:m_comBaud = B2400;break;case 2:m_comBaud = B4800;break;case 3:m_comBaud = B9600;break;case 4:m_comBaud = B19200;break;case 5:m_comBaud = B38400;break;case 6:m_comBaud = B57600;break;case 7:m_comBaud = B115200;break;case 8:m_comBaud = B230400;break;}switch(comStopBit){case 0:m_comStopBit = STOP_1; break;case 1:m_comStopBit = STOP_2; break;}switch (comDataLength){case 0:m_comDataLength = BIT_5; break;case 1:m_comDataLength = BIT_6; break;case 2:m_comDataLength = BIT_7; break;case 3:m_comDataLength = BIT_8; break;}switch(comCheckSum){case 0:m_comChecksum = P_NONE;break;case 1:m_comChecksum = P_ODD;break;case 2:m_comChecksum = P_EVEN;break;}config = m_comDataLength|m_comStopBit|m_comChecksum;//开始串⼝配置if( sio_open(m_comPort) != SIO_OK){MessageBox("串⼝打开失败","提⽰",MB_OK);this->serialsIsOpen = false;m_comPort = 0;return;}sio_flowctrl(m_comPort,0x00);//关闭硬件流控制sio_lctrl(m_comPort,0x00);//关闭RTS DTRsio_ioctl(m_comPort,m_comBaud,config);sio_flush(m_comPort,2);this->GetDlgItem(IDC_BUTTON_SERIAL_CONTROL)->SetWindowText("关闭串⼝"); GetDlgItem(IDC_COMBO_Serial_Num_Select)->EnableWindow(FALSE);GetDlgItem(IDC_COMBO_Serial_Baud_Select)->EnableWindow(FALSE);GetDlgItem(IDC_COMBO_Serial_Data_Select)->EnableWindow(FALSE);GetDlgItem(IDC_COMBO_Serial_Parity_Select)->EnableWindow(FALSE);GetDlgItem(IDC_COMBO_Serial_Stop_Select)->EnableWindow(FALSE);this->serialsIsOpen = true;}3.串⼝发送数据 sio_lstatus() sio_write()//检查串⼝是否打开,打开就发送if(serialsIsOpen == true){//变量打开了,要去测试串⼝状态if(sio_lstatus(m_comPort)>= 0){CString str1;sendString.Empty();//没有对\r\n特殊处理((CEdit*)GetDlgItem(IDC_EDIT3))->GetWindowText(str1);sendString.AppendFormat("%s",str1);sio_write(m_comPort,sendString.GetBuffer(),sendString.GetLength()); }else{//说明串⼝已经丢失MessageBox("串⼝丢失,请关闭后重新打开","错误",MB_OK);}}else{//说明串⼝已经丢失MessageBox("请先打开串⼝","错误",MB_OK);}4.设定定时器,⽤于串⼝接收数据5.在定时器中接收数据 sio_read()void CLPC1768_PAD_OTG_DebugDlg::SerialsProcessBuffer( void ){serialReadTemp.Empty();if(m_comPort > 0 && this->serialsIsOpen == true){char readBuffer[1024] = {0};// sio_flush(m_comPort,1);int length = sio_read(m_comPort,readBuffer,1024);if(length > 0){for(int i = 0; i < length; i++){serialReadTemp.AppendChar(readBuffer[i]);}}}}该库还有很多借⼝⽤于控制DTR RTS等,使⽤⽅便,详情查看帮助⽂档。
python3Serial串口助手的接收读取数据
python3Serial串⼝助⼿的接收读取数据 其实⽹上已经有许多python语⾔书写的串⼝,但⼤部分都是python2写的,没有找到⼀个合适的python编写的串⼝助⼿,只能⾃⼰来写⼀个串⼝助⼿,由于我只需要串⼝能够接收读取数据就可以了,故⽽这个串⼝助⼿只实现了数据的接收读取。
创建串⼝助⼿⾸先需要创建⼀个类,重构类的实现过程如下:1#coding=gb1803023import threading4import time5import serial67class ComThread:8def__init__(self, Port='COM3'):9#构造串⼝的属性10 self.l_serial = None11 self.alive = False12 self.waitEnd = None13 self.port = Port14 self.ID = None15 self.data = None16#定义串⼝等待的函数17def waiting(self):18if not self.waitEnd is None:19 self.waitEnd.wait()2021def SetStopEvent(self):22if not self.waitEnd is None:23 self.waitEnd.set()24 self.alive = False25 self.stop()26#启动串⼝的函数27def start(self):28 self.l_serial = serial.Serial()29 self.l_serial.port = self.port30 self.l_serial.baudrate = 11520031#设置等待时间,若超出这停⽌等待32 self.l_serial.timeout = 233 self.l_serial.open()34#判断串⼝是否已经打开35if self.l_serial.isOpen():36 self.waitEnd = threading.Event()37 self.alive = True38 self.thread_read = None39 self.thread_read = threading.Thread(target=self.FirstReader)40 self.thread_read.setDaemon(1)41 self.thread_read.start()42return True43else:44return False 创建好类后,就要实现串⼝读取的功能,其读取数据的函数如下: ⾸先要创建⼀个字符串来存放接收到的数据:data = ''data = data.encode('utf-8')#由于串⼝使⽤的是字节,故⽽要进⾏转码,否则串⼝会不识别 在创建好变量来接收数据后就要开始接收数据:1 n = self.l_serial.inWaiting()#获取接收到的数据长度2if n:3#读取数据并将数据存⼊data4 data = data + self.l_serial.read(n)5#输出接收到的数据6print('get data from serial port:', data)7#显⽰data的类型,便于如果出错时检查错误8print(type(data)) 将数据接收完后,就要对接收到的数据进⾏处理,提取出有⽤信息,由于下位机使⽤的协议不⼀样,因此处理的⽅法也不⼀样,我使⽤的协议是**+ID+*Data+*,因此我的提取⽅法如下:#获取还没接收到的数据长度n = self.l_serial.inWaiting()#判断是否已经将下位机传输过来的数据全部提取完毕,防⽌之前没有获取全部数据if len(data)>0 and n==0:try:#将数据转换为字符型temp = data.decode('gb18030')#输出temp类型,看转码是否成功print(type(temp))#输出接收到的数据print(temp)将数据按换⾏分割并输出car,temp = str(temp).split("\n",1)print(car,temp)#将temp按':'分割,并获取第⼆个数据string = str(temp).strip().split(":")[1]#由于前⾯分割后的数据类型是列表,因此需要转换成字符串,⽽后按照'*'分割,得到的也就是我们需要的Id和data str_ID,str_data = str(string).split("*",1)print(str_ID)print(str_data)print(type(str_ID),type(str_data))#判断data最后⼀位是否是'*',若是则退出,若不是则输出异常if str_data[-1]== '*':breakelse:print(str_data[-1])print('str_data[-1]!=*')except:print("读卡错误,请重试!\n") 其输出结果为:get data from serial port:b'ID:4A622E29\n\xbf\xa8\xd6\xd0\xbf\xe924\xca\xfd\xbe\xdd\xce\xaa:1*80*\r\n'<class'bytes'><class'str'>ID:4A622E29卡中块24数据为:1*80*ID:4A622E29 卡中块24数据为:1*80*180*<class'str'> <class'str'>串⼝助⼿完整代码如下:1#coding=gb1803023import threading4import time5import serial67class ComThread:8def__init__(self, Port='COM3'):9 self.l_serial = None10 self.alive = False11 self.waitEnd = None12 self.port = Port13 self.ID = None14 self.data = None1516def waiting(self):17if not self.waitEnd is None:18 self.waitEnd.wait()1920def SetStopEvent(self):21if not self.waitEnd is None:22 self.waitEnd.set()23 self.alive = False24 self.stop()2526def start(self):27 self.l_serial = serial.Serial()28 self.l_serial.port = self.port29 self.l_serial.baudrate = 11520030 self.l_serial.timeout = 231 self.l_serial.open()32if self.l_serial.isOpen():33 self.waitEnd = threading.Event()34 self.alive = True35 self.thread_read = None36 self.thread_read = threading.Thread(target=self.FirstReader)37 self.thread_read.setDaemon(1)38 self.thread_read.start()39return True40else:41return False4243def SendDate(self,i_msg,send):44 lmsg = ''45 isOK = False46if isinstance(i_msg):47 lmsg = i_msg.encode('gb18030')48else:49 lmsg = i_msg50try:51# 发送数据到相应的处理组件52 self.l_serial.write(send)53except Exception as ex:54pass;55return isOK5657def FirstReader(self):58while self.alive:59 time.sleep(0.1)6061 data = ''62 data = data.encode('utf-8')6364 n = self.l_serial.inWaiting()65if n:66 data = data + self.l_serial.read(n)67print('get data from serial port:', data)68print(type(data))6970 n = self.l_serial.inWaiting()71if len(data)>0 and n==0:72try:73 temp = data.decode('gb18030')74print(type(temp))75print(temp)76 car,temp = str(temp).split("\n",1)77print(car,temp)7879 string = str(temp).strip().split(":")[1]80 str_ID,str_data = str(string).split("*",1)8182print(str_ID)83print(str_data)84print(type(str_ID),type(str_data))8586if str_data[-1]== '*':87break88else:89print(str_data[-1])90print('str_data[-1]!=*')91except:92print("读卡错误,请重试!\n")9394 self.ID = str_ID95 self.data = str_data[0:-1]96 self.waitEnd.set()97 self.alive = False9899def stop(self):100 self.alive = False101 self.thread_read.join()102if self.l_serial.isOpen():103 self.l_serial.close()104#调⽤串⼝,测试串⼝105def main():106 rt = ComThread()107 rt.sendport = '**1*80*'108try:109if rt.start():110print(rt.l_)111 rt.waiting()112print("The data is:%s,The Id is:%s"%(rt.data,rt.ID)) 113 rt.stop()114else:115pass116except Exception as se:117print(str(se))118119if rt.alive:120 rt.stop()121122print('')123print ('End OK .')124 temp_ID=rt.ID125 temp_data=rt.data126del rt127return temp_ID,temp_data128129130if__name__ == '__main__':131132#设置⼀个主函数,⽤来运⾏窗⼝,便于若其他地⽅下需要调⽤串⼝是可以直接调⽤main函数133 ID,data = main()134135print("******")136print(ID,data)。
VB三种读取串口数据的方式
3三种读取串口数据的方式目前通用的串口通讯的软件实现方式有3种,本文都进行详细的介绍,它们各有自身的优缺点,读者在编程时可根据具体的情况选择合适的方式。
3.1利用Mscomm控件VB提供的这个通信控件“隐藏”了大部分串口通信的底层运行过程,程序员只需编写少量的代码就可以完成软件的开发过程。
在通信数据量不大,通信要求不是很高的情况下建议采取此方式。
利用Mscomm控件实现通信最需要掌握的就是它的几个主要属性,下面选取其中重要的进行介绍,其余的可以参考相关资料。
[3](1)Settings属性:以字符串的形式设置并返回波特率、奇偶校验位、数据位、停止位。
这个属性很重要,针对不同的终端设备需要根据设备的具体情况进行调整(比如日本的设备不同于美国的设备,通常会采用奇校验)。
(2)InputMode属性:设置接收数据的类型,0为文本格式,1为二进制格式。
(3)Input属性:读取并删除接收缓冲区中的数据流。
(4)Output属性:向发送缓冲区传送一数据流。
(5)Rthreshold属性:该属性为一阀值,它确定当接收缓冲区内的字节个数达到或超过该值后就产生代码为ComEvReceive的OnComm事件。
(6)Handshaking属性:设置和返回握手协议,即计算机内部CPU与串口之间的通讯协议,保证在缓冲区过载时数据不会丢失。
这个属性在保证数据传输的正确性方面有很大的作用,共有四个选项,分别表示:①无流控制;②软件流控制;③硬件流控制;④软硬件流控制。
采用硬件流控时,要求串口之间和电缆支持硬件握手,在自己制作串口通信线时,有关硬件握手的线RTS、CTS、DSR、DTR要连接正确。
在正确设置这些属性的基础上,剩下的就是打开串口,通过串口发送及接受数据了。
本文后续章节利用一个实例详细讲解了这些属性的设置及具体代码。
3.2直接调用Win32API通信函数直接调用Windows API函数,可以清楚地理解串口通信的机制,根据需要灵活地配置串口的各种参数和属性,而且直接调用低层API函数,通信效率比较高,但付出的代价就是程序较复杂,编程周期长,适合于大型通信程序及通讯质量要求较高的场合。
Com串口调试工具的使用
串口调试工具的使用串口调试工具,是电脑与下位机通讯的调试工具。
使用方法主要分:配置串口、打开串口、编辑指令、发送指令四步。
打开串口调试工具如图:第一章配置串口单击“参数设置”按扭,弹出串口参数设置对话框:在这里有三种方式供选择:串口类、网络类、MODEM 类。
[FALSEJ FALSE ▼|DTE CONTROL ENABLE JFALSE[FALSE jd[FALSE JFALSE ▼FALSE T我们一般用串口类:单击“ DCB 设置”进入串口设置对话框 停止楼土 [j T ] 奇偶棱验: 元 T 周期性发送周期 ofEinary fOutsCtsFlow fOurtxDsrFlow fDtrControl fRtsCcnt rol fDsr Sensitivity fTKC ont inueOnX of f fOvrtK flnX fErrorChar在该对话框中,一般只对:端口、波特率、数据位、停止位、奇偶校验五个属性进行设置。
端口:为电脑连接的串口,如连在 COM1,则填写COM1。
波特率:一般根据设备的通讯协议要求来设置,如通讯协议规定波特率为 115200,则波特 率应设为115200 ;如规定为 9600,则设为 9600。
数据位、停止位、奇偶校验:参数的设置也应按照通讯协议的规定来进行设置。
通常为 8 位数据位,1位停止位,无校验。
设置好单击“确定”第二章 打开串口对串口进行设置完后,单击主画面中的“连接设备渡 |I1E2OO 数据位= [8 3 按字节发送周期F TRUE 二 RTS_CONTROLJNABLE -这时会在下方的信息框看到打开串口成功。
第三章编辑指令串口打开成功后,就可以在命令编辑框中编写指令了。
如图:立件I巳视閤M 上且⑴帮助固手动发送[01][00][01][0D]是命令。
[01]中用中括号表示:一个 16进制的字符[01H] [0D]表示回车。
第四章发送指令编与好指令后,单击手动发送按钮。
怎样用串口调试助手读取欧姆龙PLC的数据小记
怎样⽤串⼝调试助⼿读取欧姆龙PLC的数据⼩记
⾸先要知道PLC的通讯协议,然后⽤串⼝编程线把PLC和电脑连接起来,打开串⼝调试助⼿,通过ASCII码对应的数据向PLC发送数据。
串⼝调试助⼿是串⼝调试相关⼯具,有多个版本。
如:串⼝调试助⼿,⽀持9600,19200等常⽤各种波特率及⾃定义波特率,可以⾃动识别串⼝,能设置校验、数据位和停⽌位,能以ASCII码或⼗六进制接收或发送任何数据或字符,可以任意设定⾃动发送周期,并能将接收数据保存成⽂本⽂件,能发送任意⼤⼩的⽂本⽂件。
硬件连接⽅⾯,传统台式PC机⽀持标准RS232接⼝,但是带有串⼝的笔记本很少见,所以需要USB/232转换接⼝,并且安装相应驱动程序。
串口调试工具使用
串口通信基本接线方法目前较为常用的串口有9针串口(DB9)和25针串口(DB25),通信距离较近时(<12m),可以用电缆线直接连接标准RS232端口(RS422,RS485较远),若距离较远,需附加调制解调器(MODEM)。
最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连,本文只涉及到最为基本的接法,且直接用RS232相连。
1.DB9和DB25的常用信号脚说明9针串口(DB9)25针串口(DB25)针号功能说明缩写针号功能说明缩写 1 数据载波检测DCD 8 数据载波检测DCD 2 接收数据RXD 3 接收数据RXD 3 发送数据TXD 2 发送数据TXD 4 数据终端准备DTR 20 数据终端准备DTR 5 信号地GND 7 信号地GND 6 数据设备准备好DSR 6 数据准备好DSR 7 请求发送RTS 4 请求发送RTS 8 清除发送CTS 5 清除发送CTS 9 振铃指示DELL 22 振铃指示DELL 2.RS232C串口通信接线方法(三线制)首先,串口传输数据只要有接收数据针脚和发送针脚就能实现:同一个串口的接收脚和发送脚直接用线相连,两个串口相连或一个串口和多个串口相连·同一个串口的接收脚和发送脚直接用线相连对9针串口和25针串口,均是2与3直接相连;·两个不同串口(不论是同一台计算机的两个串口或分别是不同计算机的串口)上面表格是对微机标准串行口而言的,还有许多非标准设备,如接收GPS数据或电子罗盘数据,只要记住一个原则:接收数据针脚(或线)与发送数据针脚(或线)相连,彼此交叉,信号地对应相接,就能百战百胜。
3.串口调试中要注意的几点:串口调试时,准备一个好用的调试工具,如串口调试助手、串口精灵等,有事半功倍之效果;强烈建议不要带电插拨串口,插拨时至少有一端是断电的,否则串口易损坏。
单工、半双工和全双工的定义如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。
CVI串口调试总结RS232
对于CVI串口调试助手(rs232)1 软件简单介绍1.1 串口界面串口调试助手用来与下位机连接,与下位机进行数据交换,实现PC机与单片机的连接和实时数据采集。
实现了十六进制的数据接收,如图1-1。
图1.1 数据转化为16进制图1-2 接收字符串1.2 CVI介绍LabWindows/CVI 是National Instruments 公司(美国国家仪器公司,简称NI 公司)推出的交互式C 语言开发平台。
LabWindows/CVI 将功能强大、使用灵活的C 语言平台与用于数据采集分析和显示的测控专业工具有机地结合起来,利用它的集成化开发环境、交互式编程方法、函数面板和丰富的库函数大大增强了C 语言的功能,为熟悉C 语言的开发设计人员编写检测系统、自动测试环境、数据采集系统、过程监控系统等应用软件提供了一个理想的软件开发环境。
NI公司的LabWindows/CVI是一个久经验证的用于测试和测量的ANSI C 开发环境,极大地提高了工程师和科学家们的生产效率。
他们使用LabWindows/CVI来开发高性能的、可靠的应用程序,用于制造测试、军事/航天、通讯、设计验证和汽车工业等领域。
开发人员可以在设计阶段利用LabWindows/CVI的硬件配置助手、综合调试工具以及交互式执行功能,来运行各项功能,使得这些领域的开发流水线化。
使用内置的测量库,你可以迅速的开发出复杂的应用程序,例如多线程编程和ActiveX的服务器/客户端程序。
由于LabWindows/CVI的便利性,你可以通过在相似环境中重复使用以前的代码来维护你的代码投资,并且实现Windows、Linux®或实时平台上分布测试系统的无缝集成。
2 软件介绍CVI内部封装了RS-232 library。
2.1 callbacksCallbacks中只含有一个函数InstallComCallbackint InstallComCallback (int portNumber, int eventMask, int notifyCount, int eventCharacter, ComCallbackPtr callbackFunction, void *callbackData);Allows you to install a synchronous callback function for a particular COM port.The callback function is called whenever any of the events specified in eventMask occur on the COM port and you allow the system to process events.Example:InstallComCallback (V alue, LWRS_RXCHAR, 0, 0, (void *)uartRevData, 0);2.2 control2.2.1 ComBreak (int portNumber, int breakTime_msec);A break signal is a communications signal that allows two communications devices to transmit a break signal in the transmission line. A break signal is the transmission of a special character on the communication line for a period longer than the transmission time for one character and its framing bits.2.2.2 ComSetEscape (int portNumber, int escapeCode);指导一个COM端口进行扩展功能如清除或设置RTS信号线或设置收发器模式对RS - 485。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通信采用MODBUS RTU协议,一帧数据格式为:1位起始位+ 8位数据+ 1位停止位
通信采用Modbus通信协议功能代码:
03H——读单个或连续多个寄存器
06H——写单个寄存器
10H——写连续多个寄存器
RTU命令格式及示例
03H——读单个或连续多个寄存器
下传命令:
反馈:。
06H——写单个寄存器
下传命令:
数据(阴影部分)。
反馈:
10H——写连续多个寄存器下传命令:
2 WORD数据内容(阴影部分)。
反馈:
用COMMIX串口调试软件读取数据:
在使用前,需先将效验方式选择为“CRC16(ModbusRTU)”,如图(1)所示。
其余设置参见图(2)。
图(1)
读取电机实时状态,比如读取全部96台电机的状态,则可发送命令“01 03 20 00 00 0c”
01:设备地址(再起动控制柜地址)
03:功能号(读单个或连续多个寄存器)
2000:实时电机状态(1~8号电机)寄存器地址
000c:从起始地址为2000H的寄存器读取连续12 WORD的内容。
如图(2)所示:
图(2)
发送之后,反馈如图(3):(运行的电机为9~16号电机,其余电机没有运行)
图(3)。