windev 20 中文版使用串口做上位机
用windev写一个简单的pc端串口上位机简直非常简单。

第一步(可选!)先找到电脑上可用的com口,这里用的是查注册表。(先看设备管理器再直接用串口号连也可以)
串口设备列表 是 字符串型 = 注册表值列表(“HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM”)// 这里的查询结果是一个用回车连接的字符串
串口com号列表 是 字符串型
对于 串口设备列表 中被回车分隔的每个子串 ADevice// 遍历语句,ADevice用于指代每次循环选中的子串
串口com号列表 += 注册表读值(“HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM”,ADevice)
结束
窗口_串口测试.输入框_可用串口 = 串口com号列表

当然也可以直接从1到255遍历所有串口号测试是不是能打开串口,结果最准确可以避免一些存在于注册表但无法使用的虚拟串口,不过就费时间了
下一步:打开串口
串口打开结果 是 布尔型 = 串行端口打开(窗口_串口测试.组合框_选择串口..值,32768,32768,串行端口.默认超时,真)
注意最后一个 “真” 代表启用串口事件,这里有个坑,windev的函数的可选参数是有顺序的,如果要启用第二个可选参数,就要显式的声明一个可选参数(默认参数也要写出来)。使用事件可以做到异步编程,不用阻塞线程。最后的测试可以看到cpu占用率完全不同。
然后就是 配置串口参数
串行端口配置参数(窗口_串口测试.组合框_选择串口..值,数值(窗口_串口测试.组合框_选择波特率..显示值),(窗口_串口测试.组合框_奇偶校验..值-1),数值(窗口_串口测试.组合框_数据位..显示值),( 窗口_串口测试.组合框_停只位..值 - 1))
注意windev中文版中控件的主属性如果是文本,默认编码格式都是unicode,就算看到的是数字也是unicode文本而不是数。注意,新手请避免用串口传递汉字,避免字符编码的巨坑,而且函数名,变量名中不能出现保留字,例如 停止 是 保留字,就不能给一个函数起名 停止读取,估计是汉化时候没考虑词法分析适配汉语。
然后就是在分配事件所调用的过程,
串行端口事件(窗口_串口测试.组合框_选择串口..值,串行端口.接受字符,"单次读完缓冲区") //发生串口接收字符事件后调用“单次读缓冲区”
双引号内的就是发生事件后调用的过程,并且 串行端口事件 会默认给调用的过程传递两个参数:发生事件的串口号,事件的编码

然后在 调用的过程 里读取数据,windev中传输非ansi文本都需要用缓冲区类型。注意这里的编码转换 ,windev的空间接收Unicode的文本才不会乱码,至于字符集用utf8是因为 arduino ide2.0的默认编码就是utf8

用串口发数据就简单

这里用一个简单的arduino串口回声程序测试软件
void setup(){ Serial.begin(9600); } void loop(){ if ( Serial.available() ) { Serial.println( Serial.readString() ); } }
测试即使发送的内容有汉字也不会乱码。另外Serial.readString()默认是会等一秒钟,以确保全部读取完缓冲区的数据
最后来个瞎搞,如果用单片机常用的死循环来电脑读串口 ,会怎样

写在主线程里软件就只在读取串口,点软件其他地方都是无响应
新开一个线程
线程执行(“Thread_read_buffer”,线程.正常,“重复读缓冲区”,窗口_串口测试.组合框_选择串口..值)
软件倒是看着正常,不过cpu占用率在我这个6核cpu上高达30%。
使用事件就不到0.5%
例程下载地址 https://pan.baidu.com/s/10dQMXisy3lvfq-ruQ2URAw
提取码 1234
20210511更新,可以使用 保存参数 函数 保存当次使用的串口号,然后在 控件的初始化事件里 使用 加载参数 函数 自动调用上次的配置

浙公网安备 33010602011771号