此教程面向的读者:对医疗器械上位机编程有兴趣,或者急需了解医疗器械(尿常规、血液分析、生化、心电、B超等医疗下位仪器)的编程流程、编程细节的程序员。

1、得到仪器协议

当我们需要与医疗器械等下位机数据交互时,我们需要知道它用的是哪种协议,这样才能得到我们想要的数据。当然,没有协议,我们也能解析,在此步骤的弟三段中我将提到。得到协议后,我们将得到重要的几样东西,比如波特率、数据位、停止位等连接参数,是单工通信还是双工通信,以及数据传输协议,是否需要上位机响应才发送有效数据,现在一般机器使用HL7协议,但也有厂家自己定义的协议,比如普康协议。

当我们得到协议,仪器传过来的数据是我们想要的数据。比如尿液分析仪,我们一般需要尿胆原、潜血、胆红素、酮体等数据,仪器传过来的数据中已经包含了这些数据(当然,尿液分析仪一般也没有工作台),那我们就可以开始步骤3、,开始测试连接阶段了。但如果我们需要的不是仪器传过来的数据,比如B超,就算对接了仪器,得到的也只是图像,而我们需要的是是否正常、是否有某些疾病的数据,这就要开始步骤2、,从工作台中得到数据。

如果尽力后还是没有得到协议,可以从网上搜索此种型号仪器的连接参数与协议,实在都得不到,就只能自己观察返回的数据,取得自己想要的数据了。当然如果工作台提供lis接口(比如很多生化设备工作台都提供lis接口),我们就可以直接从工作台中取数据。还有一种需要使用工作台的情况是,当从仪器中取回的数据不是自己想要的东西时(比如B超),我们就需要用到工作台了。

2、工作台

1、当仪器工作台提供lis接口时,写个服务,服务的内容就是解析得到的数据与其它需要的操作。服务放在哪里视自己具体的业务需求而定。

2、当仪器返回的数据不是自己所需,工作台也没提供lis接口时,可从工作台的数据库取自己所需的数据,如果工作台的数据库没有或只包含一部分数据,则可根据工作台的工作机制取需要的数据。比如某B超工作台,仪器返回的信息不是我们所需要的,其access中的数据并没有包含医技输入的B超诊察结果,诊查结果被保存为一个word文档——当医技每保存一个被诊查者的信息时,工作台同时保存信息到数据库与创建名字为数据库id同名的文件夹,文件夹下的诊查结果word文档。根据其工作机制,我们可以在工作台设备上作一个监听程序,监听是否有新文件夹的产生。当有新文件夹产生时,读取其下的word文档结果,与读取数据库用户表与文件夹同名的id,则取出我们所有需要的信息。

补充:监听类: FileSystemWatcher  命名空间:  System.IO

3、测试连接

在开始编码之前,我们需要将rs232线从仪器连接到我们编程的电脑。并下载串口数据调试器,波特率等我们第一步了解到的参数,测试数据是否顺利从仪器过来,排除代码外的出错信息。然后我们就可以从医疗器械那里传数据过来了。一些仪器传输数据的方法集成到了打印中去,这些熟悉以后自己可以推理出怎么传输,但刚开始的时候需要做第一步,得到传输的方式。如果下位机需要上位机发送确认字符响应才继续发送有效数据,

4、编码阶段

.NET Framework中提供了SerialPort 类进行串口操作,所在命名空间: System.IO.Ports,程序集: System(位于 System.dll)

有兴趣的朋友可以去看看它的底层实现,微软已经将实现SerialPort 类的代码开源到: https://referencesource.microsoft.com/#System/sys/system/io/ports/SerialPort.cs,ae0a3218c6c9f7fe

我们可以将公共部分定义为一个父类PortOperate,继承此类即不用干复制粘贴等劳力活,将精力集中在解析数据上

  public class PortOperate
  {
protected readonly SerialPort spReceive = new SerialPort();
/// <summary>
/// 默认端口号
/// </summary>
protected string com = "COM1"; /// <summary>
/// 接收串口的缓存
/// </summary>
public string ReceivedMsg { get; set; } /// <summary>
/// 加载配置文件XML的串口
/// </summary>
public PortOperate(string port)
{
com = port;
spReceive.PortName = com;
} /// <summary>
/// 是否存在端口
/// </summary>
/// <returns></returns>
public bool IsPost()
{
//获取串口端口名称数组
string[] ports = SerialPort.GetPortNames();
//是否发现端口
bool findPort = false;
foreach (string port in ports)
{
if (port.ToUpper() == com)
{
findPort = true;
break;
}
}
return findPort;
}
/// <summary>
/// 打开端口
/// </summary>
/// <returns></returns>
public bool Open()
{
try
{
if (spReceive == null)
{
//处理代码
}
if (spReceive.IsOpen)
{
spReceive.Close();
}
spReceive.Open();
return true;
}
catch (Exception ex)
{
//处理代码
return false;
}
} /// <summary>
/// 关闭端口
/// </summary>
/// <returns></returns>
public bool Close()
{
try
{
if (spReceive.IsOpen)
{
spReceive.Close();
}
return true;
}
catch (Exception)
{
return false;
}
} protected abstract void SendMessage();
}

子类继承父类实现代码

    protected override void SendMsg()
{ if (Open())
{
spReceive.DataReceived += spReceive_DataReceived;
}
}
private void spReceive_DataReceived(object sender, SerialDataReceivedEventArgs e)
{ bool AllowReceive = true;
if (AllowReceive == true)
{
byte[] ReDatas = new byte[spReceive.BytesToRead];
spReceive.Write(new byte[] { 0x06 }, , );
Thread.Sleep();
spReceive.Read(ReDatas, , ReDatas.Length);//读取数据
BindData(ReDatas);
}
else
{
spReceive.DiscardInBuffer();
} }

查看连接的端口可在我的电脑->设备管理器中查看,也可用代码实现,查看连接rsr232线的端口都是哪些端口号

public List<string> GetAllPorts()
{
List<String> allPorts = new List<String>();
foreach (String portName in System.IO.Ports.SerialPort.GetPortNames())
{
allPorts.Add(portName);
}
return allPorts;
}

5、测试

当解析医疗仪器项目写好后,下一步当然是测试,测试数据有没有被正确解析,有没有按我们想象中那样运行。窗体程序或控制台程序调试简单,断点即可。但服务项目怎么调试呢?服务项目.net framework提供了installutil.exe调试,我们可以利用它来调试

首先我们需要开启服务,开启服务批处理

%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe 你的服务项目可执行文件路径

Net Start ServiceTest //serverinstaller设置的服务名字

sc config ServerTest start= auto
pause

批处理执行成功后在vs中依次点击、调试->附加到进程,附加到批处理对应的exe进程,即可对服务进行调试。

如果不需要服务则可卸载服务,卸载服务批处理:

%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u 你的服务项目可执行文件路径
pause

医疗器械c#上位机开发指引教程的更多相关文章

  1. 【专题教程第8期】基于emWin模拟器的USB BULK上位机开发,仅需C即可,简单易实现

    说明:1.如果你会emWin话的,就可以轻松制作上位机.做些通信和控制类上位机,比使用C#之类的方便程度一点不差,而且你仅会C语言就可以.2.并且成功将emWin人性化,可以做些Windows系统上的 ...

  2. USBCAN的使用和上位机开发(MFC)

    USBCAN使用手册 参见:https://blog.51cto.com/12572800/2062839 1. USB CAN软件安装与硬件接线 USB CAN是常用的CAN测试工具.它的软件资料存 ...

  3. C#上位机开发(二)—— Hello,World

    上一篇大致了解了一下单片机实际项目开发中上位机开发部分的内容以及VS下载与安装,按照编程惯例,接下来就是“Hello,World!” 1.新建C#项目工程 首先选择新建Windows窗体应用(.NET ...

  4. Winform 快速开发框架,上位机开发,工控机程序开发,CS程序开发

    1.当客户让你做个CS程序时,当你手上一穷二白,所有都要重复造轮,你是不是很烦. 2.但如果有一个通用的,快速开发框架,就可以把你从这些基础的工作解救出来,你专注做业务就好了. 3.本人其中一个项目的 ...

  5. 上位机开发之三菱Q系列PLC通信实践

    经常关注我们公众号或者公开课的学员(如果还没有关注的话,左上角点击一波关注)应该知道,我们会经常使用西门子PLC,其实对于其他品牌的PLC,我们都会讲到,包括三菱.欧姆龙.基恩士.松下及国产台达.信捷 ...

  6. 上位机开发之三菱FX3U以太网通信实践

    上次跟大家介绍了一下上位机与三菱Q系列PLC通信的案例,大家可以通过点击这篇文章:上位机开发之三菱Q系列PLC通信实践(←戳这里) 今天以三菱FX3U PLC为例,跟大家介绍一下,如何实现上位机与其之 ...

  7. 上位机开发之西门子PLC-S7通信实践

    写在前面: 就目前而言,在中国的工控市场上,西门子仍然占了很大的份额,因此对于上位机开发而言,经常会存在需要与西门子PLC进行通信的情况.然后对于西门子PLC来说,通信方式有很多,下面简单列举一下: ...

  8. 周立功USBCAN-II 上位机开发(MFC)

    使用的USB转CAN的设备是周立功的USBCAN-II,在购买的时候,会有上位机二次开发的库文件.例程和API文档等材料,可以参考. 1.库函数的调用 首先,把库函数文件都放在工作目录下.库函数文件总 ...

  9. C#上位机开发(一)—— 了解上位机

    在单片机项目开发中,上位机也是一个很重要的部分,主要用于数据显示(波形.温度等).用户控制(LED,继电器等),下位机(单片机)与 上位机之间要进行数据通信的两种方式都是基于串口的: USB转串口 — ...

随机推荐

  1. 多线程 Synchronized关键字和Lock

    Synchronized  分为实例锁和全局锁. 实例锁为 synchronized(this) 和 非static synchronized方法.   也加对象锁. 只要一个线程访问这类的一个syn ...

  2. h5移动端屏幕适配

    1.rem <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  3. JavaScript(第十四天)【面向对象和原型】

    学习要点: 1.学习条件 2.创建对象 3.原型 4.继承 ECMAScript有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建 ...

  4. 听翁恺老师mooc笔记(15)--文件的输入与输出

    <>重定向 如果使用标准的printf输出,有一个比较简便的方法,可以将程序的结果写入一个文件.使用<和>符号,将程序运行结果重定向到文件中去,具体使用到的代码如下: ./te ...

  5. Beta 第三天

    今天遇到的困难: 组员对github极度的不适应 github的版本控制和协同化编程确实操作起来需要一定的熟练度,我们缺乏这种熟练度 Android Studio版本不一致项目难以打开的问题仍然无法解 ...

  6. Django 模版语法

    一.简介 模版是纯文本文件.它可以产生任何基于文本的的格式(HTML,XML,CSV等等). 模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的 标签. {% extends "base ...

  7. IIS 配置 FTP 网站

    在 服务器管理器 的 Web服务器IIS 上安装 FTP 服务 在 IIS管理器 添加FTP网站 配置防火墙规则 说明:服务器环境是Windows Server 2008 R2,IIS7.5. 1. ...

  8. cookie中存中文

    cookie中存中文 1:想要在cookie中存中文:需要用到URLEncoder(在jdkAPI中有介绍) Cookie cookie = new Cookie("User",U ...

  9. SpringCloud的服务注册中心(三) - 进一步了解 Eureka

    一.服务治理参与者 服务注册中心: eureka-server 服务提供者:HELLO-SERVICE 服务消费者 :HELLO-CONSUMER 很多时候,客户端既是服务提供者又是服务消费者,-&g ...

  10. loadrunner录制时web时,安全证书问题

    测试环境:win7+LoadRunner11+ie9 遇到的问题:用LoadRunner录制时,打开百度,总是报安全证书问题,如图所示 解决方法:Tools——Recording Options——p ...