没有真实串口设备时使用"虚拟串口驱动"调试你的串口代码
前言
很多时候需要编写串口代码,但是又没有真实串口设备来调试代码。以及本身就是要操作2个串口的情况,可以使用“虚拟串口驱动”工具方便的调试代码。
使用方法就是点击添加端口,此时“COM1 <-> COM2”是一组,及对COM1写数据会让COM2读到,对COM2写数据会让COM1读到,是不是很方便。
下面是“虚拟串口驱动”工具的截图,我是在网上随便找的一个汉化版,大家可自行百度下载吧。

示例代码
- 串口收发都是不太好控制的,因此我下面的程序使用“\n”作为结束符,当收到“\n”时认为本次接受数据已完整,发送数据结尾带上“\n”。
package main
import (
"fmt"
"os"
"github.com/tarm/serial"
)
/* https://www.eltima.com/products/vspdxp/ : 虚拟串口工具 */
func main() {
if len(os.Args) != 3 {
return
}
com, err := serial.OpenPort(&serial.Config{
Name: os.Args[1],
Baud: 9600,
Size: 8,
Parity: serial.ParityNone,
StopBits: serial.Stop1,
})
if err != nil {
panic(err)
}
defer com.Close()
var n int
buf := make([]byte, 128)
if os.Args[2] == "server" {
for {
n, err = readCom(com, buf)
if err != nil {
panic(err)
}
fmt.Printf("[%s]\n", buf[:n])
err = writeCom(com)
if err != nil {
panic(err)
}
}
} else {
for {
err = writeCom(com)
if err != nil {
panic(err)
}
n, err = readCom(com, buf)
if err != nil {
panic(err)
}
fmt.Printf("[%s]\n", buf[:n])
}
}
}
func readCom(com *serial.Port, buf []byte) (int, error) {
cnt := 0
for {
n, err := com.Read(buf[cnt:])
if err != nil {
return 0, err
}
for i := cnt + n; i >= cnt; i-- {
if buf[i] == '\n' {
// 找到结束标记符,确定是一条完整的信息
return i, nil
}
}
cnt += n
}
}
func writeCom(com *serial.Port) error {
var send string
fmt.Scanln(&send)
var (
buf = []byte(send + "\n")
end = len(buf)
start = 0
)
for start < end {
n, err := com.Write(buf[start:])
if err != nil {
return err
}
start += n
}
// 确保所有数据都发送完成,然后刷新缓存
return com.Flush()
}
- 运行效果

总结
有时候需要调试串口代码,但每次接设备进行调试很麻烦,使用“虚拟串口驱动”工具不仅可以用来调试代码,甚至可以做到单元测试里面。
毕竟验证代码逻辑还得用上真实设备不仅麻烦,而且难以控制,使用该工具完美解决问题。
没有真实串口设备时使用"虚拟串口驱动"调试你的串口代码的更多相关文章
- Yocto开发笔记之《串口驱动调试》(QQ交流群:519230208)
QQ群:519230208,为避免广告骚扰,申请时请注明 “开发者” 字样 ======================================================== 串口驱动各 ...
- linux UART串口驱动开发文档
转:http://www.360doc.com/content/10/0417/18/829197_23519037.shtml linux UART串口驱动开发文档时间:2010-01-09 14: ...
- ARM-Linux S5PV210 UART驱动(5)----串口的open操作(tty_open、uart_open)
串口驱动初始化后,串口作为字符驱动也已经注册到系统了,/dev目录下也有设备文件节点了. 那接下来uart的操作是如何进行的呢? 操作硬件之前都是要先open设备,先来分析下这里的open函数具体做了 ...
- 【驱动】USB驱动实例·串口驱动·键盘驱动
Preface USB体系支持多种类型的设备. 在 Linux内核,所有的USB设备都使用 usb_driver结构描述. 对于不同类型的 USB设备,内核使用传统的设备驱动模型建立设备驱动 ...
- 【驱动】USB驱动实例·串口驱动·键盘驱动【转】
转自:http://www.cnblogs.com/lcw/p/3159370.html Preface USB体系支持多种类型的设备. 在 Linux内核,所有的USB设备都使用 usb_drive ...
- Smart210学习记录------linux串口驱动
转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=27025492&id=327609 一.核心数据结构 串口驱动有 ...
- 从串口驱动的移植看linux2.6内核中的驱动模型 platform device & platform driver【转】
转自:http://blog.csdn.net/bonnshore/article/details/7979705 写在前面的话: 博主新开了个人站点:你也可以在这里看到这篇文章,点击打开链接 本文是 ...
- ARM-Linux S5PV210 UART驱动(3)----串口核心层、关键结构体、接口关系
尽管一个特定的UART设备驱动完全可以按照tty驱动的设计方法来设计,即定义tty_driver并实现tty_operations其中的成员函数,但是Linux已经在文件serial_core.c中实 ...
- linux串口驱动分析——打开设备
串口驱动是由tty_driver架构实现的.一个应用程序中的函数要操作硬件,首先会经过tty,级级调用之后才会到达驱动之中.本文先介绍应用程序中打开设备的open函数的整个历程. 首先在串口初始化中会 ...
随机推荐
- [Docker] redis 全配置
启动容器,加载配置文件并持久化数据 docker run -d --privileged=true -p 6379:6379 --restart always -v /usr/redis/conf:/ ...
- 99%的Android开发不得不面对的三道坎,到底该怎么破?
今年比往年要特殊一些,受疫情的影响,很多公司都出现了裁员现象.以至于最近很多技术同学也在纷纷向我倒苦水. 王鹏便是其中的一员,王鹏之前是在一线城市的一家小型互联网公司做Android应用开发.从毕业实 ...
- Asp常见函数
ASP语言的特点: 1.允许使用VBscript或java script简易Script语言,并可在文件中结合Html: 2.无需编译,由WEBserver执行产生: 3.与任何ActiveX Scr ...
- C++冷知识(1)
func()等价于func(void) 也就是说在C++中,参数列表为空意味着不接受任何参数.之所以要注意这一点是因为在C语言中,参数列表为空意味着参数不确定.两者的语义是有巨大差别的,作为学了C再学 ...
- git tag的应用
一,git的tag是什么? tag就是给commit起一个容易记忆容易理解的名字 说明:架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectfores ...
- centos8平台:用fontconfig安装及管理字体(fc-list/fc-match/fc-cache)
一,fc-list所属的rpm包 [root@blog ~]$ whereis fc-list fc-list: /usr/bin/fc-list /usr/share/man/man1/fc-lis ...
- Python-selenium显示等待
#coding=utf-8 from selenium import webdriver from selenium.webdriver.common.by import By from seleni ...
- Spring官方都推荐使用的@Transactional事务,为啥我不建议使用!
GitHub 17k Star 的Java工程师成神之路,不来了解一下吗! GitHub 17k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 17k Star 的Java工 ...
- sql 删除所有存储过程
1.执行以下sql语句即可删除所有存储过程 --/**********删除所有存储过程*************************/-- use 数据库名 go declare @tname v ...
- RocketMQ扫盲篇
本篇博客主要参考: <浅入浅出>-RocketMQ 敖丙 APACHE-RocketMQ Gitee RocketMQ官方文档 RocketMQ 实战与进阶 GitChat 又是好久没有写 ...