夸克之书

  • 首页
  • 科普
  • 笔记
  • C#
  • 物联网
  • 算法
  • Linux
  • 树莓派
夸克之内,别有洞天
  1. 首页
  2. 物联网
  3. 正文

树莓派等ARM开发板C#串口通信(.NET Core)

2019-02-05 1182点热度 1人点赞 4条评论

使用基于Net Core的C#编写串口通信程序。串口通信依赖于WiringPi库,所以需要将WiringPi库libwiringPi.so.2.0拷贝到程序运行目录下面。

先去https://github.com/tronsoft/WiringPiSharp下载 WiringPiSharp 。

树莓派等ARM开发板C#串口通信(.NET Core)插图

然后将其添加到项目中,并添加引用。

树莓派等ARM开发板C#串口通信(.NET Core)插图1
添加到项目中
树莓派等ARM开发板C#串口通信(.NET Core)插图2
添加项目引用

然后编写测试代码

using System;
using System.Text;
using System.Threading.Tasks;
using WiringPiSharp;

namespace UARTDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            string device = "/dev/ttyS1";
            if (Setup.WiringPiPiSetup() < 0)
            {
                Console.WriteLine("Wringpi setup failed.");
                return;
            }
            int fd = Serial.SerialOpen(device, 115200);
            if (fd < 0)
            {
                Console.WriteLine("Serial ppen failed.");
                return;
            }
            //异步执行串口读取
            Task readTask = Task.Run(() => SerialRead(fd));
            //发送
            while (true)
            {
                Console.Write("TX:");
                string send = Console.ReadLine();
                if (string.IsNullOrEmpty(send))
                {
                    continue;
                }
                if (send == "exit")
                {
                    break;
                }
                Serial.SerialPuts(fd, send);
            }
            Serial.SerialClose(fd);
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey(false);
        }

        static void SerialRead(int fd)
        {
            while (true)
            {
                StringBuilder sb = null;
                while (Serial.SerialDataAvail(fd) > 0)
                {
                    int read = Serial.SerialGetchar(fd);
                    if (read < 0)
                    {
                        Serial.SerialFlush(fd);
                        break;
                    }
                    else
                    {
                        //Remove r or n
                        if (read == 10 || read == 13)
                        {
                            continue;
                        }
                        else
                        {
                            if(sb == null)
                            {
                                sb = new StringBuilder();
                            }
                            sb.Append((char)read);
                        }
                    }
                }
                if (sb != null)
                {
                    string readStr = sb.ToString();
                    if (!string.IsNullOrWhiteSpace(readStr))
                    {
                        Console.WriteLine($"RX:{sb.ToString()}");
                    }
                }
            }
        }
    }
}

程序采用异步执行的方式,在读取数据的同时,可以发送数据。

选择ARM平台发布项目

树莓派等ARM开发板C#串口通信(.NET Core)插图3
选择ARM再发布

将publish文件夹上传到开发板中,然后将WiringPi的库文件复制到publish当中,程序运行依赖于WiringPi库。手里面的树莓派被我搞坏了,现在用的是Nanopi Duo。

要注意的是,这里我是自己编译的WiringPi,且库文件名必须为libwiringPi.so.2.0。

cp /root/wiringpi/libwiringPi.so.2.0 /publish

然后运行

sudo dotnet UARTDemo.dll
  • 树莓派等ARM开发板C#串口通信(.NET Core)插图4

Demo下载

UARTDemo下载
本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2020-12-13

Afirefish

夸克之内,别有洞天

打赏 点赞
< 上一篇
下一篇 >

文章评论

  • 我爱阳妈

    您好,ARM平台发布项目怎么创建的?

    2020-12-07
    登录以回复
    • 管理员

      @我爱阳妈 你好,现在.NET CORE已经原生支持ARM平台的串口通讯了,不建议采用这篇文章里面的方式进行串口通讯,虽然也可以用。原生串口通讯可以参考:https://www.quarkbook.com/?p=712
      发布的话,在发布选项卡中选中ARM平台发布就行了。

      2020-12-08
      登录以回复
      • 我爱阳妈

        @管理员 这个是发送字符串的,怎么发送字节数组?叩谢

        2021-01-13
        登录以回复
        • 管理员

          @我爱阳妈 不建议采用这篇文章里面的方法了,.Net Core在树莓派中可以使用System.IO.Ports下面SerialPort串口类进行串口通信。
          SerialPort中的Write方法可以发送字节数组。具体可以查看:https://docs.microsoft.com/zh-cn/dotnet/api/system.io.ports.serialport?redirectedfrom=MSDN&view=dotnet-plat-ext-5.0&viewFallbackFrom=net-5.0
          文章的话,可以参考:https://www.quarkbook.com/?p=712

          2021-01-13
          登录以回复
  • 您需要 登录 之后才可以评论

    Afirefish

    夸克之内,别有洞天

    搜索文章
    分类目录
    • C# (28)
    • Linux (3)
    • 树莓派 (13)
    • 物联网 (19)
    • 科普 (4)
    • 笔记 (30)
    • 默认 (44)
    最新 热点 随机
    最新 热点 随机
    树莓派PWM风扇控制 PVE重启后LVM Thin数据丢失,错误:Volume group "****" has insufficient free space (128 extents): 4048 required. OpenWrt配置SmartDNS OpenWrt x86安装Frpc Intel网卡开机显示Initializing Intel(R) Boot Agent GE v1.5.50 IdentityServer4证书创建 免费本地解析域名(locallocal.cn),支持HTTPS 使用淘宝npm以及安装cnpm
    Steam饥荒专用服务器搭建你见过哪些有趣的代码?修改PostgreSQL数据库默认用户postgres密码在VS Code开发Arduino项目Error response from daemon: cannot stop container: ******: Cannot kill container *******:.....单机Docker搭建FastDFSC# Json序列化时将长整型(long)属性序列化为Json字符串使用淘宝npm以及安装cnpm
    树莓派自动化推流摄像头到Bilibili直播 OpenWrt配置SmartDNS C# RTMP推流到网页实现直播 IIS应用程序池两种运行模式:集成模式和经典模式。 C#中抽象类(abstract)和接口(interface)的相同点与区别 树莓派PWM风扇控制 解决问题:The context cannot be used while the model is being created 使用淘宝npm以及安装cnpm
    最近评论
    发布于 2 周前(02月21日) 好的谢谢,那我只能通过kill杀死推流指令进程来实现了。
    发布于 2 周前(02月21日) 要用这个项目的话,你得自己拉代码来改了。做这玩意儿主要是考虑全天候的,没考虑过关[笑哭]
    发布于 2 周前(02月21日) 就是想问有没有能通过代码控制的关闭推流的指令,而不需要手动控制。我想设置一个按钮来控制开始推流和结束...
    发布于 2 周前(02月20日) 唔,没懂你意思,直接拔电源不就行了。不拔电源关闭推流服务也行撒。
    发布于 2 周前(02月20日) 你好,我想问一下,如果不想推流了,该用什么方法停止树莓派推流呢?
    书签
    • 打赏
    • 毒鸡汤(有点意思)
    • 米店
    • 金鱼直播间
    放松一下
    https://www.quarkbook.com/wp-content/uploads/2020/09/Yanni-Nightingale.flac
    用户您好!请先登录!
    登录 注册

    COPYRIGHT © 2020 夸克之书. ALL RIGHTS RESERVED.

    THEME KRATOS MADE BY VTROIS

    蜀ICP备15036129号-9

    登录
    注册|忘记密码?