c#通过串口及CAN模块实现上位及下位机通讯
目录
前言
一、串口、CAN总线
二、使用步骤
1.RS232串口通讯(指令下发与接收)
2.CAN总线通讯
总结
前言
学习及工作中我们经常会遇到上位机与下位机通讯等工作,结合场景使用不同的通讯方式实时通讯,以下为工作中遇到的上位机与下位机进行实时通讯,采用RS232串口和CAN总线形式进行网络通讯。
一、串口、CAN总线
串行接口简称串口,也称串行通讯接口或串行通讯接口(通常指设备的COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface)是指数据一位一位地顺序传送。其特点是通讯简单,只要一对传输线,通过设备设置传输线端口等参数就可以实现双向通信,从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。
CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO 11898),是国际上应用最广泛的现场总线之一。 在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议。上位机与与下位机制定好通用协议通过CAN模块将数据进行16进制转换实时通讯。
二、使用步骤
1.RS232串口通讯(指令下发与接收)
代码如下(示例):
//命名空间引入
using System.IO.Ports;
public SerialPort serialPort;//定义串口对象类public
//定义连接方法
public void Connect()
{
serialPort = new SerialPort();
serialPort.BaudRate = 1200;//波特率
serialPort.PortName = "COM1";
serialPort.Parity = Parity.None;//校验法:无
serialPort.DataBits = 8;//数据位:8
serialPort.StopBits = StopBits.One;//停止位:1
try
{
serialPort.Open();//打开串口
serialPort.DtrEnable = true;//设置DTR为高电平
serialPort.RtsEnable = true;//设置RTS位高电平
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);//DataReceived事件委托
byte[] WriteBuffer = Encoding.ASCII.GetBytes("下发指令");
//下发
serialPort.Write(WriteBuffer, 0, WriteBuffer.Length);
}
catch (Exception ex)
{
//打开串口出错,显示错误信息
Console.WriteLine("串口打开失败");
}
}
2.CAN总线通讯
代码如下(示例):
//首先与CAN模块进行连接
public TcpClient mTcp = new TcpClient();
private const int READ_BUFFER_SIZE = 1000;
private byte[] readBuffer = new byte[READ_BUFFER_SIZE + 1];
public delegate void DoReadEventHandle(object sender, string e);
public event DoReadEventHandle ReadedEvent;
public event DoReadEventHandle LogEvent;
public string recStr { get; set; }
public string HandString { get; set; }
public bool Connect()
{
//Can模块ip
string mIPAddress = "192.168.1.1";
IPAddress hostIPAddress = IPAddress.Parse(mIPAddress);
//端口
int mPort = 8080;
IPEndPoint endIP = new IPEndPoint(hostIPAddress, mPort);
try
{
mTcp = new TcpClient(mIPAddress, mPort);
DateTime Savetime = DateTime.Now;
TimeSpan n = new TimeSpan();
while (true)
{
n = DateTime.Now - Savetime;
if (n.TotalMilliseconds > 1000 || mTcp.Client.Connected) break;
}
if (!mTcp.Client.Connected) return false;
mTcp.GetStream().BeginRead(readBuffer, 0, READ_BUFFER_SIZE, DoRead, null);
}
catch (Exception)
{
return false;
}
return true;
}
private void DoRead(IAsyncResult ar)
{
try
{
int BytesRead = mTcp.GetStream().EndRead(ar);
if (BytesRead > 0)
{
string s = "";
for (int i = 0; i <= BytesRead - 1; i++)
{
s = s + string.Format("{0:x2}", readBuffer[i]) + " ";
}
Console.WriteLine(s);
var t = s.Split(new string[] { "aa 00 ff 00 00 00 00 00 00 00 00 00 55" }, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(ex => ex != " ");
if (!string.IsNullOrEmpty(t))
{
recStr += t + "\r\n";
if (HandString == recStr && LogEvent != null)
{
HandString = null;
LogEvent(this, "握手成功!");
}
} mTcp.GetStream().BeginRead(readBuffer, 0, READ_BUFFER_SIZE, DoRead, null);
}
}
catch (Exception e)
{
mTcp.Client.Close();
}
}
//数据发送
public void sendCan(string temperature, bool check)
{
HandString = "0xC0 0x02 0x02 0x00 0x00";
string[] tmp = temperature.Split(' ');
var buf = new byte[22];
for (int i = 0; i < buf.Length; i++)
{
buf[i] = 0;
}
for (int i = 0; i < tmp.Length; i++)
{
try
{
buf[i] = Convert.ToByte(tmp[i], 16);
}
catch (Exception e)
{
buf[i] = 0;
}
}
SendData(buf, 0, 13, check);
}
public bool SendData(byte[] sendBytes, int mStart, int mLen, bool check = true)
{
if (!check) return false;
try
{
lock (mTcp.GetStream())
{
mTcp.GetStream().Write(sendBytes, mStart, mLen);
}
return true;
}
catch (Exception x)
{
return false;
}
}
总结
1、RS232串口通讯
接口的信号电平值较高,易损坏接口电路的芯片,传输速率较低,传输距离有限。
2、CAN模块通讯
具有实时性强、传输距离较远、抗电磁干扰能力强、成本低等优点;可根据报文的内容决定接收或屏蔽该报文;通讯过程信道容易阻塞。
————————————————
版权声明:本文为CSDN博主「奔波灞」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43292039/article/details/108215111
c#通过串口及CAN模块实现上位及下位机通讯的更多相关文章
- 多个rs485设备怎样跟上位机通讯?
http://bbs.hcbbs.com/thread-819457-1-1.html 多个rs485设备怎样跟上位机通讯? [复制链接] |关注本帖 fdemeng 签到天数: 1228 天 ...
- C#做上位机软件——绘图并传输给下位机
拿到任务之后首先分成了几个部分: 1.绘图.学习了GDI+ 2.图片保存. 3.将图片转换成byte[].由于使用Socket通信,只能传输byte[]数据,所以这一步是向下位机传输的关键. 相应地, ...
- C# WPF上位机实现和下位机TCP通讯
下位机使用北京大华程控电源DH1766-1,上位机使用WPF.实现了电压电流实时采集,曲线显示.上午在公司调试成功,手头没有程控电源,使用TCP服务端模拟.昨天写的TCP服务端正好排上用场. 界面如下 ...
- linux下保存下位机输出的串口信息为文件
linux下保存下位机输出的串口信息为文件 1.stty -F /dev/ttyUSB0 raw (转换成raw模式) 2.stty -F /dev/ttyUSB0 speed 115200 (设置波 ...
- [python] 3 、基于串口通信的嵌入式设备上位机自动测试程序框架(简陋框架)
星期一, 20. 八月 2018 01:53上午 - beautifulzzzz 1.前言 做类似zigbee.ble mesh...无线网络节点性能测试的时候,手动操作然后看表象往往很难找出真正的原 ...
- VS2013+MFC串口控件的简单上位机
因为做东西,正好用到这里.所以就上传了文件分享一下. 利用VS带的MFC库,用起来还是比较方便的.空间的程序构架都是自动生成的,具体的程序自己加进去就行. 里面有整个的工程 还带有一个生成的EXE文件 ...
- ros与下位机通信常用的c++ boost串口应用
一.首先移植c++ boost 库: 1. 先去 Boost官网 下载最新的Boost版本, 我下载的是boost_1_6_0版本, 解压. 2. 进入解压后目录: cd boost_1_6_0, 执 ...
- ros与下位机通信常用的c++ boost串口应用--22
摘要: 原创博客:转载请表明出处:http://www.cnblogs.com/zxouxuewei/ 一.首先移植c++ boost 库: 1. 先去 Boost官网 下载最新的Boost版本, 我 ...
- node.js模块本地代理模块(将自己本机/局域网)服务 代理到外网可以访问
npm 模块 localtunnel模块可以. lt --port 7000 其中7000是本地服务端口 会分配一个动态的url. 局域网中查看本地ip用ifconfg 或者在系统偏好设置里面查看网 ...
- USRP通信的结构体和常量(上位机、下位机共用)
fw_common.h包括了USRP固件和上位机共用的代码,寄存器地址映射.结构体定义等 #include <stdint.h> /*! * Structs and constants f ...
随机推荐
- 第三次bolg作业
1.前言 在 Java 面向对象程序设计课程的学习之旅中,我经历了知识的积累与思维的蜕变.这门课程通过丰富多样的教学环节,如 Blog 作业.PTA 作业.实验.线上线下课程,帮助我逐步构建起 Jav ...
- 基于CentOS Stream 8的物联网平台深度优化方案
系统架构全景图 图表 一.系统平台优化(CentOS Stream 8) 1. 系统基础配置 bash # 1. 系统更新与加固 sudo dnf update -y sudo dnf install ...
- ET5.0服务端架构
1: 整体架构图(图片来源 注意:现在的客户端与服务器的链接只有Realm和Gate.也就是说,客户端在第一次登陆时链接Realm,然后链接Gate,但是不连接Map.Map与Client之间的通讯完 ...
- 激活Windows系统的便捷方法【小白友好】
如下图,点击任务栏上的搜索栏,输入 powershell ,然后点击以管理员运行. 2.点击以管理员运行后,会打开如下窗口: 3.复制下列命令粘贴到powershell窗口注意,[一定要复制不要手动输 ...
- CMD 命令启动管理员模式代码
::==========================================:: 获取管理员权限set _Args=%*if "%~1" NEQ "" ...
- audio 定制化
简介 RT 参考连接 https://www.cnblogs.com/lalalagq/p/9961959.html
- 前端项目中的需求 pdf 转 svg
简介 通过 工具 inskcape 参考链接 https://zhuanlan.zhihu.com/p/144722704
- ARM Cortex-M3/M4初学习(未完待续)
ARM Cortex-M3/M4初学习 0. 架构与核心特性 0.1 指令集架构 基于ARMv7-M架构,支持Thumb-2指令集(混合16/32位指令集) 基于哈佛架构,数据和指令分布存储在独立的空 ...
- USB(2.0 / Type-C) to MPSSE(JTAG / SPI / IIC) / UART / FIFO: FT4232 USB-SPI python调试
FT4232 USB-SPI python调试 硬件连接 选择USB自供电模式(无需外部电源), jumper跳线帽设置3.3V; 连接PC电脑. 驱动 Linux/MacOS/Windows大多都能 ...
- ubuntu上搭建ChatGLM2-6b环境及ptuing微调训练的坑
清华大学的chatGLM2-6B可以说是目前亚洲唯一能打的对中文支持不错的LLM大模型,网上已经有很多介绍如何在本机搭建环境的文章,就不再重复了,这里记录下最近踩的一些坑: 1.为啥要使用ubuntu ...