C# 串口通信总结
在C#串口通信开发过程中有的产家只提供通信协议,这时候开发人员要自己根据协议来封装方法,有的产家比较人性化提供了封装好的通信协议方法供开发人员调用。
1、只提供通信协议(例如,今年早些时候开发的出钞机):


如:
/// <summary>
/// 出钞 DISPENSE(0x45)
/// </summary>
public void Chuchao()
{
log("出钞设备出钞");
if (!sp.IsOpen)
{
sp.Open();
}
try
{
var send = new byte[] { Eot, Id, Stx, Dipsense, 48, 51, Etx, 0x01 };
int bcc = 0;
for (int i = 0; i < send.Length - 1; i++)
bcc ^= send[i];
send[send.Length - 1] = (byte)bcc;
sp.Write(send, 0, send.Length);
log("操作命令:" + GetBytesString(send, 0, send.Length, " "));
for (int i = 0; i < 3; i++)
{
var r = sp.ReadByte();
log("发送命令,收到的反馈。" + r);
if (r != Ack)
{
sp.Write(send, 0, send.Length);
}
else
{
break;
}
}
byte[] recive = new byte[14];
for (int i = 0; i < 3; i++)
{
bcc = 0;
recive = GetData(recive.Length);
for (int j = 0; j < recive.Length - 1; j++)
{
bcc ^= recive[j];
}
if (bcc != recive[recive.Length - 1])
{
sp.Write(new byte[] { Nck }, 0, 1);
log("收到信息:" + GetBytesString(recive, 0, recive.Length, " ") + ",接收标识:NCK:失败");
}
else
{
sp.Write(new byte[] { Ack }, 0, 1);
log("收到信息:" + GetBytesString(recive, 0, recive.Length, " ") + ",接收标识:ACK:成功");
break;
}
}
Error errorCode = new Error();
errorCode.Code = recive[9];
log("接收到的命令:" + recive[3] + ",接收到的错误码:" + errorCode.Code + "--" + errorCode.ErrorMsg);
if (recive[3] != Dipsense || errorCode.Code > 0x31)
{
throw new Exception("出钞出错");
}
}
catch (Exception e)
{
log(e.ToString());
//throw;
}
finally
{
if (sp.IsOpen)
{
sp.Close();
}
}
}
2、产家提供通信协议方法(例如,今年早些时候开发的银行卡支付机):
这时候你只要在你的项目bin/Debug下面添加产家提供的dll,然后,再这样:
/// <summary>
/// 打开串口
/// </summary>
/// <param name="port">串口号字符串</param>
/// <returns>
/// 串口文件句柄
/// 备注:必须先调用此函数,获得指定串口的串口文件句柄,才可调用其他函数。
/// 可以同时打开多个串口,获得多个串口文件句柄,但不能多次打开同一个串口。
/// 使用完毕后,必须调用CommClose()关闭串口。
/// </returns>
[DllImport("CRT_310.dll", EntryPoint = "CommOpen", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr CommOpen(string port); /// <summary>
/// 按指定的波特率打开串口 (该函数完成的功能= CommOpen 函数+ CommSetting 函数)
/// </summary>
/// <param name="port">串口号字符串</param>
/// <param name="data">指定波特率
/// 波特率=1200,2400,4800,9600,19200,38400。
/// 例如:CommOpen("Com1",9600);
/// </param>
/// <returns>串口文件句柄
/// 备注:必须先调用此函数,获得指定串口的串口文件句柄,才可调用其他函数。
/// 可以同时打开多个串口,获得多个串口文件句柄,但不能多次打开同一个串口。
/// 使用完毕后,必须调用CommClose()关闭串口。</returns>
[DllImport("CRT_310.dll", EntryPoint = "CommOpenWithBaut", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr CommOpenWithBaut(string port, uint data);
然后就可以像这样调用了:
public string CardBoxPositionToRead()
{
var comHandle = new IntPtr();
var cardStates = new byte[2];
var recordInfo = new byte[200];
int? data;
try
{
comHandle = PackageK100Dll.M100A_CommOpenWithBaud(ComPort, BaudRate);
if (comHandle.ToInt32() == 0)
{
PackageK100Dll.M100A_CommClose(comHandle);
return "打开串口失败!";
}
data = PackageK100Dll.M100A_CheckCardPosition(comHandle, false, 0, cardStates, recordInfo);
if (data != 0)
{
PackageK100Dll.M100A_CommClose(comHandle);
return "读取卡片位置失败";
}
switch (cardStates[0])
{
//通道无卡
case 48:
break;
case 49:
case 50:
data = PackageK100Dll.M100A_MoveCard(comHandle, false, 0, 0x34, recordInfo);
if (data != 0)
{
PackageK100Dll.M100A_CommClose(comHandle);
return "移动卡片位置失败";
}
break;
//通道有卡
default:
PackageK100Dll.M100A_CommClose(comHandle);
return "请取走卡片或者业务正在办理,请稍候!";
}
switch (cardStates[1])
{
case 48:
PackageK100Dll.M100A_CommClose(comHandle);
return "卡箱无卡";
default:
//将卡槽卡片移动到读写卡位置
data = PackageK100Dll.M100A_MoveCard(comHandle, false, 0, 0x30, recordInfo);
if (data != 0)
{
PackageK100Dll.M100A_CommClose(comHandle);
return "移动卡片位置失败";
}
PackageK100Dll.M100A_CommClose(comHandle);
return "true";
} }
catch (Exception)
{
PackageK100Dll.M100A_CommClose(comHandle);
return "发生异常";
}
}
C# 串口通信总结的更多相关文章
- .NET 串口通信
这段时间做了一个和硬件设备通信的小项目,涉及到扫描头.输送线.称重机.贴标机等硬件.和各设备之间通信使用的是串口或网络(Socket)的方式.扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通 ...
- BluetoothChat用于蓝牙串口通信的修改方法
本人最近在研究嵌入式的串口通信,任务是要写一个手机端的遥控器用来遥控双轮平衡小车.界面只用了一个小时就写好了,重要的问题是如何与板子所带的SPP-CA蓝牙模块进行通信. SPP-CA模块自带代码,在这 ...
- Win10 IoT C#开发 4 - UART 串口通信
Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,既可以开发设备UI与用户交互式操作,又可以控制GPIO等接口,使得原来嵌入式繁琐的开发变得简单.通过Remote Debug ...
- 使用Java实现简单串口通信
最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^ 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar ...
- Java 串口通信
在Windows系统下,用Java开发串口通信相关的程序时,需要用到几个文件. (1)win32com.dll 要放在jdk\jre\bin目录下. (2)comm.jar 和javax.comm.p ...
- .NET 串口通信中断接收,包含0X1A(作为EOF)
.NET串口通信中将`0X1A`当做EOF处理,.NET接收到EOF会触发一次接收中断,此时事件形参`SerialDataReceivedEventArgs`值为枚举 `Eof`,其他为`Chars` ...
- STC12C5A60S2 双串口通信
STC12C5A60S2单片机是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1的功能及操作与传统51单片机串行口相同:特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器, ...
- mfc 调用Windows的API函数实现同步异步串口通信(源码)
在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半 ...
- VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
首先,在 vs2008 环境下创建 MFC 运用程序 设置项目名称为 ComTest(这个地方随意命名,根据个人习惯),点击确定后,点击下一步 出现如下界面 选择"基于对话框"模式 ...
- C语言dsPIC / PIC24 serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新dsPIC/PIC2 ...
随机推荐
- Muzei Live Wallpaper壁纸应用安卓源码项目
这个刚刚在安卓教程网那里看到的,这个是Muzei Live Wallpaper壁纸应用源码,这是已经在Playstore上线了的android壁纸应用,点击壁纸界面可以磨砂透明效果以及一般背景效果之间 ...
- .NET Web开发总结(四)
6.1 IIS配置站点 · IIS ,英文全称Internet Information Services, 是Windows服务器操作系统自带的*服务器软件* · 通过IIS ...
- [原]hdu2045 不容易系列三——LELE的RPG难题 (递推方程)
本文出自:blog.csdn.net/svitter 原题:http://acm.hdu.edu.cn/showproblem.php?pid=2045 题意:中文不用我说了吧. 这个题目的关键就在于 ...
- CentOS学习笔记--SCSI 设备热插拔
CentOS学习笔记--SCSI 设备热插拔 处于运行中的服务器,因业务要求也许不允许重启机器,而新添加的SCSI设备(主要是硬盘)如何实现热插拔呢? 首先需要查看一下设备: #cat /proc/s ...
- c语言学习第四天数据类型1
int 代表整数,它在内存中占4个字节,二进制的表示方式是占用了三十二位,二进制中只包含0和1,那它的最大值就是全为1,但int是 有符号类型,所以最高位(左边的第一位)要拿出来做符号位,这样就只 ...
- php中关于抽象(abstract)类和抽象方法的问题解析
在面向对象(OOP)语言中,一个类可以有一个或多个子类,而每个类都有至少一个公有方法作为外部代码访问的接口.而抽象方法就是为了方便继承而引入的,现在来看一下抽象类和抽象方法分别是如何定义以及他们的特点 ...
- 5)Java部分常用package功能介绍
1> java.lang (package) 这个是系统的基础类,比如String等都是这里面的,这个package是唯一一个可以不用import就可以使用的Package 包中关键类 ...
- Ubuntu安装wps for linux
1.WPS For Linux 2013 还是只提供了32位版本,我用的是 64位 Ubuntu,如果您也是64位系统,还需要提前安装一些32位的库文件. sudo apt-get install i ...
- 百度 UEditor 简单安装调试和调用,网上其它的教程太官方了,不适合新手
对于新手来说,只要能实现功能即可,其它设置完全默认. 预览图: 1.首先 到官网下载,这个不多说.下载后解压到网站你想要的目录,我这里放到根目录下在你需要使用编辑器的地方,插入如下HTML代码: &l ...
- STM32F4_引领入门
Ⅰ.概述 该文写给那些想学ST芯片开发(或初级学习)的朋友,文章着重细节,或许有点简单. 笔者想告诉那些刚开始学习ST的朋友,不管你使用哪一个系列(F0.F1.F2),哪一种型号芯片,其实学习的方法和 ...