没有真实串口设备时使用"虚拟串口驱动"调试你的串口代码
前言
很多时候需要编写串口代码,但是又没有真实串口设备来调试代码。以及本身就是要操作2个串口的情况,可以使用“虚拟串口驱动”工具方便的调试代码。
使用方法就是点击添加端口,此时“COM1 <-> COM2”
是一组,即对COM1写数据会让COM2读到,对COM2写数据会让COM1读到,是不是很方便。
下面是“虚拟串口驱动”工具的截图,我是在网上随便找的一个汉化版,大家可自行百度下载吧。
示例代码
- 串口收发都是不太好控制的,因此我下面的程序使用“\n”作为结束符,当收到“\n”时认为本次接收数据已完整,发送数据结尾带上“\n”。
copypackage 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()
}
- 运行效果
总结
有时候需要调试串口代码,但每次接设备进行调试很麻烦,使用“虚拟串口驱动”工具不仅可以用来调试代码,甚至可以做到单元测试里面。
毕竟验证代码逻辑还得用上真实设备不仅麻烦,而且难以控制,使用该工具完美解决问题。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~