SerialPort访问接口获取电子称数据

合集下载

利用C#通过串口提取GPS定位信息

利用C#通过串口提取GPS定位信息

利用C#通过串口提取GPS定位信息作者:许海峰顔鹏苏仙鹤来源:《硅谷》2013年第02期摘要: GPS定位信号的提取可以用VB,VC实现,但实际应用时会比较难用。

利用C#语言提供的SerialPort类非常简单地实现了GPS定位信号的提取。

关键词: GPS定位信号;C#;SerialPort全球定位系统(GPS)是一种基于空间卫星导航系统,可在地球上和地球附近提供全天候的位置和时间信息的服务。

GPS系统具有高效率、多功能、高精度、操作简便、应用广泛等特点。

因此,GPS不仅诸多民用领域广泛应用,在军事领域方面应用更为广泛。

1 GPS信号的格式GPS接收机工作时会将接收到的GPS导航定位信息通过串口存放在缓存中。

只有通过编写程序将各个字段的信息从缓存字节流中提取出来,才能将其转化成我们需要的数据。

同任何通讯协议一样,也是通过帧结构完成对各种GPS定位信息的提取。

对于本文所使用的GARMIN GPS天线板,它发送到计算机的数据主要由帧头、帧尾和帧内数据组成。

帧头表明了后续帧内数据结构的组成。

每帧都是用回车符和换行符作为帧尾结束标识。

“$GPRMC”帧包含了经纬度、速度、时间等定位数据,我们可以通过处理帧头为“$GPRMC”的数据来获得我们需要的定位数据。

如果我们需要的数据在其它帧中时,我们则需要处理相应的帧就可以。

处理方法与本文中处理“$GPRMC”帧一样。

帧头为“$GPRMC”帧的结构中主要包含了时间、位置、纬度、日期、速度等信息。

本文通过用C#语言编写了利用串口来提取GPS信息的程序,在实验时采用的GPS76接收,GPS76的指标为:定位时间、定位精度、动态性能、速度精度。

2 利用C#通过串口提取GPS信息作为一个基本的串口通信程序,程序需要包含串口选择,波特率选择,打开,关闭,接受数据,显示。

下面开始具体讲解:第一步,用VS2010创建一个基于C#的winForm项目,并设计界面。

第二步,引入SerialPort的命名间.using System.IO.Ports,并实例化串口对象private SerialPort my = new SerialPort(),定义存储GPS文本信息的变量string gpstext = ""。

串口读取地磅电子秤C#源代码

串口读取地磅电子秤C#源代码

串⼝读取地磅电⼦秤C#源代码 1using System;2using System.Collections.Generic;3using ponentModel;4using System.Data;5using System.Drawing;6using System.Linq;7using System.Text;8using System.Windows.Forms;9using System.IO.Ports;10using System.Threading;11using Microsoft.Win32;12using System.IO;1314namespace串⼝端⼝读取地磅15 {16public partial class Form1 : Form17 {18public Form1()19 {20 InitializeComponent();21 }22private SerialPort SerialPort1 = new SerialPort();//串⼝资源对象23public delegate void HandleInterfaceUpdataDelegate(string text); //委托,此为重点24private HandleInterfaceUpdataDelegate interfaceUpdataHandle;25private int FanChongQuChangDu = 15;//读取缓冲区指定长度2627/*28 *特别注意:地磅电⼦秤如果输出接⼝接错,收到的则是乱码29*/3031public void Sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)32 {33try34 {35if (SerialPort1.IsOpen)//端⼝打开中36 {37string strTemp = "";38//程序等待0.5秒让缓冲区获取串⼝数据39double iSecond = 0.5;4041 DateTime dtOld = System.DateTime.Now;42 DateTime dtNow = System.DateTime.Now;43 TimeSpan dtInter;44 dtInter = dtNow - dtOld;4546int i = SerialPort1.BytesToRead;47if (i > 0)48 {49try50 {51 strTemp = SerialPort1.ReadExisting();52 }53catch54 { }55if (strTemp.ToLower().IndexOf("\r") < 0)56 {57 i = 0;58 }59else60 {61this.Invoke(interfaceUpdataHandle, strTemp);62 }63 }64while (dtInter.TotalSeconds < iSecond && i <= 0)65 {66 dtNow = System.DateTime.Now;67 dtInter = dtNow - dtOld;68 i = SerialPort1.BytesToRead;69if (i > 0)70 {71try72 {73 strTemp += SerialPort1.ReadExisting();74 }75catch76 { }77if (strTemp.ToLower().IndexOf("\r") < 0)78 {79 i = 0;81else82 {83this.Invoke(interfaceUpdataHandle, strTemp);84 }85 }86 }87 }88 }89catch (Exception cw)90 {91 MessageBox.Show(cw.ToString());92return ;93 }9495 }9697private void UpdateTextBox(string text)98 {99100 txtShiShiZhongLiang.Text = text;101102if (SerialPort1.IsOpen)//端⼝打开103 {104 txtState.Text = "端⼝连接中";105 }106else107 {108 txtState.Text = "端⼝已断开";109 }110 }111112///<summary>113///执⾏AT指令并返回成功失败114///</summary>115///<param name="ATCmd">AT指令</param>116///<param name="StCmd">AT指令标准结束标识</param>117///<returns></returns>118private void ATCommand3(string ATCmd, string StCmd)119 {120string response = "";121 response = ATCommand(ATCmd, StCmd);122 }123124///<summary>125///执⾏AT指令并返回结果字符126///</summary>127///<param name="ATCmd">AT指令</param>128///<param name="StCmd">AT指令标准结束标识</param>129///<returns></returns>130private string ATCommand(string ATCmd, string StCmd)131 {132string response = "";133int i;134if (!ATCmd.EndsWith("\x01a"))135 {136if (!(ATCmd.EndsWith("\r") || ATCmd.EndsWith("\r\n")))137 {138 ATCmd = ATCmd + "\r";139 }140 }141 SerialPort1.WriteLine(ATCmd);142143//第⼀次读响应数据144if (SerialPort1.BytesToRead > 0)145 {146 response = SerialPort1.ReadExisting();147148//去除前端多可能多读取的字符149if (response.IndexOf(ATCmd) > 0)150 {151 response = response.Substring(response.IndexOf(ATCmd)); 152 }153else154 {155156 }157158if (response == "" || response.IndexOf(StCmd) < 0)159 {160if (response != "")161 {162if (response.Trim() == "ERROR")163 {165 }166if (response.IndexOf("+CMS ERROR") >= 0)167 {168string[] cols = new string[100];169 cols = response.Split(';');170if (cols.Length > 1)171 {172string errorCode = cols[1];173 }174 }175 }176 }177 }178179//读第⼀次没有读完的响应数据,直到读到特征数据或超时180for (i = 0; i < 3; i++)181 {182 Thread.Sleep(1000);183 response = response + SerialPort1.ReadExisting();184if (response.IndexOf(StCmd) >= 0)185 {186break;187 }188 }189190return response;191192193 }194195///<summary>196///从注册表获取系统串⼝列表197///</summary>198private void GetComList()199 {200 RegistryKey keyCom = Registry.LocalMachine.OpenSubKey("Hardware\\DeviceMap\\SerialComm"); 201if (keyCom != null)202 {203string[] sSubKeys = keyCom.GetValueNames();204this.cbxDuanKouHao.Items.Clear();205foreach (string sName in sSubKeys)206 {207string sValue = (string)keyCom.GetValue(sName);208this.cbxDuanKouHao.Items.Add(sValue);209 }210 }211 }212213private void cmID_DropDown(object sender, EventArgs e)214 {215 GetComList();216 }217218private void Form1_Load(object sender, EventArgs e)219 {220221 GetComList();222 btPause.Enabled = false;223 }224225//暂停监听读取数值226private void btPause_Click(object sender, EventArgs e)227 {228 SerialPort1.Close();229if (SerialPort1.IsOpen)//端⼝打开230 {231 txtState.Text = "端⼝连接中";232 }233else234 {235 txtState.Text = "端⼝已断开";236 }237 btENT.Enabled = true;238 btPause.Enabled = false;239240 }241//⼀直监听读取数值242private void btENT_Click(object sender, EventArgs e)243 {244if ((this.cbxDuanKouHao.Text.Trim() != "") && (this.cbxBoTeLv.Text != ""))245 {246if (SerialPort1 != null )247 {249 SerialPort1.DataReceived += new SerialDataReceivedEventHandler(Sp_DataReceived);250//串⼝更改251if (SerialPort1.PortName != this.cbxDuanKouHao.Text.Trim())252 {253 SerialPort1.Close();254 SerialPort1.Dispose();255 SerialPort1 = new SerialPort();//串⼝资源对象256 interfaceUpdataHandle = new HandleInterfaceUpdataDelegate(UpdateTextBox);//实例化委托对象257 SerialPort1.PortName = this.cbxDuanKouHao.Text.Trim();258 SerialPort1.BaudRate = Convert.ToInt32(this.cbxBoTeLv.Text.Trim());259 SerialPort1.Parity = JiaoYanWei(cbxJiaoYanWei.Text);260 SerialPort1.StopBits = TingZhiWei(cbxTingZhiWei.Text);261 SerialPort1.Encoding = Encoding.ASCII;//获取传输字符编码262 SerialPort1.DataReceived += new SerialDataReceivedEventHandler(Sp_DataReceived);263 SerialPort1.ReceivedBytesThreshold = 1;264try265 {266 SerialPort1.Open();267268 ATCommand3("AT+CLIP=1\r", "OK");269270271 btPause.Enabled = true;272 btENT.Enabled = false;273 }274catch (Exception)275 {276 MessageBox.Show("端⼝" + this.cbxDuanKouHao.Text.Trim() + "打开失败!");277 }278 }279else//串⼝未更改280 {281if(SerialPort1.IsOpen)//端⼝已打开282 {283 btPause.Enabled = true;284 btENT.Enabled = false;285 }286else287 {288 SerialPort1.Open();289 btPause.Enabled = true;290 btENT.Enabled = false;291 }292 }293 }294else295 {296 interfaceUpdataHandle = new HandleInterfaceUpdataDelegate(UpdateTextBox);//实例化委托对象297 SerialPort1.PortName = this.cbxDuanKouHao.Text.Trim();298 SerialPort1.BaudRate = Convert.ToInt32(this.cbxBoTeLv.Text.Trim());299 SerialPort1.Parity = JiaoYanWei(cbxJiaoYanWei.Text);300 SerialPort1.StopBits = TingZhiWei(cbxTingZhiWei.Text);301 SerialPort1.Encoding = Encoding.ASCII;//获取传输字符编码302 SerialPort1.DataReceived += new SerialDataReceivedEventHandler(Sp_DataReceived);303 SerialPort1.ReceivedBytesThreshold = 1;304try305 {306 SerialPort1.Open();307308 ATCommand3("AT+CLIP=1\r", "OK");309310311 btPause.Enabled = true;312 btENT.Enabled = false;313 }314catch (Exception)315 {316 MessageBox.Show("端⼝" + this.cbxDuanKouHao.Text.Trim() + "打开失败!");317 }318 }319 }320else321 {322 MessageBox.Show("请输⼊正确的端⼝号和波特率!");323this.cbxDuanKouHao.Focus();324 }325 }326327///<summary>328///读⼀次数:注意电⼦秤设置的发送信息规则:如果不是连续发送,是稳定后发送,则有时候读不到数329///</summary>330///<param name="sender"></param>331///<param name="e"></param>334try335 {336if ((this.cbxDuanKouHao.Text.Trim() != "") && (this.cbxBoTeLv.Text != ""))337 {338if (SerialPort1 != null)339 {340 SerialPort1.Close();341 SerialPort1.Dispose();342 SerialPort1 = new SerialPort();//重新创建串⼝资源对象,否则导致程序卡死343//串⼝更改344if (SerialPort1.PortName != this.cbxDuanKouHao.Text.Trim())345 {346 SerialPort1.PortName = this.cbxDuanKouHao.Text.Trim();347 SerialPort1.BaudRate = Convert.ToInt32(this.cbxBoTeLv.Text.Trim());348 SerialPort1.Parity = JiaoYanWei(cbxJiaoYanWei.Text);349 SerialPort1.StopBits = TingZhiWei(cbxTingZhiWei.Text);350 SerialPort1.Encoding = Encoding.ASCII;//获取传输字符编码351 SerialPort1.ReceivedBytesThreshold = 1;352try353 {354 SerialPort1.Open();355356 ATCommand3("AT+CLIP=1\r", "OK");357this.txtShiShiZhongLiang.Text = dushu();358 }359catch (Exception)360 {361 MessageBox.Show("端⼝" + this.cbxDuanKouHao.Text.Trim() + "打开失败!"); 362 }363 }364else//串⼝未更改365 {366if (SerialPort1.IsOpen)//端⼝已打开367 {368 ATCommand3("AT+CLIP=1\r", "OK");369this.txtShiShiZhongLiang.Text = dushu();370 }371else372 {373 SerialPort1.Open();374 ATCommand3("AT+CLIP=1\r", "OK");375this.txtShiShiZhongLiang.Text = dushu();376 }377 }378 }379else380 {381382 SerialPort1.PortName = this.cbxDuanKouHao.Text.Trim();383 SerialPort1.BaudRate = Convert.ToInt32(this.cbxBoTeLv.Text.Trim());384 SerialPort1.Parity = JiaoYanWei(cbxJiaoYanWei.Text);385 SerialPort1.StopBits = TingZhiWei(cbxTingZhiWei.Text);386387 SerialPort1.ReceivedBytesThreshold = 1;388try389 {390 SerialPort1.Open();391392 ATCommand3("AT+CLIP=1\r", "OK");393this.txtShiShiZhongLiang.Text = dushu();394 }395catch (Exception)396 {397 MessageBox.Show("端⼝" + this.cbxDuanKouHao.Text.Trim() + "打开失败!"); 398 }399 }400 }401else402 {403 MessageBox.Show("请输⼊正确的端⼝号和波特率!");404this.cbxDuanKouHao.Focus();405 }406if (SerialPort1.IsOpen)407 {408 SerialPort1.Close();409 }410 }411catch (Exception)412 {413414return;415 }419///读取缓冲区指定长度数值420///</summary>421///<param name="changdu"></param>422///<returns></returns>423private string dushu()424 {425string strTemp = "";426try427 {428if (SerialPort1.IsOpen)//端⼝打开中429 {430431int i = SerialPort1.BytesToRead;//获取缓冲区字节数432433#region程序等待0.5秒让缓冲区获取串⼝数据434double iSecond = 0.5;435436 DateTime dtOld = System.DateTime.Now;437 DateTime dtNow = System.DateTime.Now;438 TimeSpan dtInter;439 dtInter = dtNow - dtOld;440441while (dtInter.TotalSeconds < iSecond && i <= 0)442 {443 dtNow = System.DateTime.Now;444 dtInter = dtNow - dtOld;445 i = SerialPort1.BytesToRead;446 }447#endregion448if (i > 0)449 {450try451 {452453byte[] buf = new byte[FanChongQuChangDu];// 定义接收缓冲区454 SerialPort1.Read(buf, 0, FanChongQuChangDu);455for (int j = 0; j < FanChongQuChangDu; j++)456 {457458 ASCIIEncoding ASCIITochar = new ASCIIEncoding();459char[] ascii = ASCIITochar.GetChars(buf); // 将接收字节解码为ASCII字符数组460 strTemp += ascii[j];461//已读到换⾏符就跳出462if (strTemp.ToLower().IndexOf("\r") > 0)463 {464break;465 }466 }467 }468catch469 { }470 }471 }472 }473catch (Exception)474 {475476return strTemp;477 }478return strTemp;479 }480481private void btnZhuaQu_Click(object sender, EventArgs e)482 {483this.txtZhuaQuZhi.Text = this.txtShiShiZhongLiang.Text;484 }485///<summary>486///返回校验位487///</summary>488///<param name="zhi"></param>489///<returns></returns>490private Parity JiaoYanWei(string zhi)491 {492switch (zhi)493 {494case"Even": return Parity.Even;495case"Mark": return Parity.Mark;496case"None": return Parity.None;497case"Odd": return Parity.Odd;498case"Space": return Parity.Space;499default: return Parity.None;503///返回停⽌位504///</summary>505///<param name="zhi"></param>506///<returns></returns>507private StopBits TingZhiWei(string zhi)508 {509switch (zhi)510 {511case"0": return StopBits.None;512case"1": return StopBits.One;513case"1.5": return StopBits.OnePointFive;514case"2": return StopBits.Two;515default: return StopBits.One;516 }517 }518///<summary>519/// ASCII码转字符520///</summary>521///<param name="asciiCode"></param>522///<returns></returns>523public static string asciiToString(int asciiCode)524 {525if (asciiCode >= 0 && asciiCode <= 255)526 {527 System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();528byte[] byteArray = new byte[] { (byte)asciiCode };529string strCharacter = asciiEncoding.GetString(byteArray);530return (strCharacter);531 }532else533 {534throw new Exception("ASCII Code is not valid.");535 }536 }537//⽤封装对象来实现538private void button1_Click(object sender, EventArgs e)539 {540try541 {542 mycom mycom1 = new mycom();543 mycom1.PortNum = cbxDuanKouHao.Text;544 mycom1.BaudRate = Convert.ToInt32(cbxBoTeLv.Text);545 mycom1.StopBits = 8;546 mycom1.Parity = 0;547 mycom1.StopBits = Convert.ToByte(cbxTingZhiWei.Text);548 mycom1.ReadTimeout = 10;549550 mycom1.Open();551string dushu = "";552byte[] buf = mycom1.Read(12);553554for (int j = 0; j < 12; j++)555 {556557 ASCIIEncoding ASCIITochar = new ASCIIEncoding();558char[] ascii = ASCIITochar.GetChars(buf); // 将接收字节解码为ASCII字符数组559 dushu += ascii[j];560561 }562563 txtShiShiZhongLiang.Text = dushu;564565 mycom1.Close();566 }567catch (Exception cuowu)568 {569 MessageBox.Show(cuowu.Message);570return ;571 }572573 }574 }575 }。

电子秤使用串口与计算机进行通讯

电子秤使用串口与计算机进行通讯

BE01型仪表通讯编程现有电子秤一台,使用串口与计算机进行通讯。

编写VB程序来访问串口,达到读取电子秤上显示的数据。

该电子秤为BE01型仪表,输出为RS-232C标准接口,波特率为300-9600、偶校验、7个数据位、2个停止位。

所有字符均发送11位ASCII码,一个起始位。

在VB中与串口通讯需要引入控件MSComm 串口通讯控件(在Microsoft Comm Control 6.0中)。

具体程序如下:控件简称:MSCDim Out(12) As Byte '接收var中的值Dim var As Variant '接收MSC.input中的数值Dim nRece As Integer '计算MSC.inputbuffer的个数Dim i As Integer, j As Integer '随即变量,计算循环******************************************************************** ********Private Sub Form_Load()ClearTextWith MSC.CommPort = 1 '设置Com1为通信端口.Settings = "9600,E,7,2" '设置通信端口参数 9600赫兹、偶校验、7个数据位、1个停止位.(这里需要进一步说明的是:.Setting=”BBBB,P,D,S”。

含义是:B:Baud Rate(波特率);P:Parity(奇偶);D:Data Bit;S:Stop Bit).InBufferSize = 40 '设置缓冲区接收数据为40字节.InputLen = 1 '设置Input一次从接收缓冲读取字节数为1.RThreshold = 1 '设置接收一个字节就产生OnComm事件End WithEnd Sub******************************************************************** ********Private Sub ClearText()Text3.Text = ""Text2.Text = "5"Text1.Text = ""End SubPrivate Sub Command1_Click()ClearText' nRece = 0 '计数器清零With MSC.InputMode = comInputModeBinary '设置数据接收模式为二进制形式.InBufferCount = 0 '清除接收缓冲区If Not .PortOpen Then.PortOpen = True '打开通信端口End IfEnd WithEnd SubPrivate Sub MSC_OnComm()DelayTime ‘用来延续时间ClearTextWith MSCSelect Case .CommEvent '判断通信事件Case comEvReceive: '收到Rthreshold个字节产生的接收事件SwichVar 1If Out(1) = 2 Then '判断是否为数据的开始标志.RThreshold = 0 '关闭OnComm事件接收End IfDoDoEventsLoop Until .InBufferCount >= 3 '循环等待接收缓冲区>=3个字节' nRece = nRece + 1For i = 2 To 12SwichVar iText1.Text = Text1.Text & Chr(Out(i))NextText1.Text = LTrim(Text1.Text)Text2.Text = Text2.Text & CStr(nRece).RThreshold = 1 '打开MSComm事件接收Case Else' .PortOpen = FalseEnd SelectEnd WithEnd Sub******************************************************************** ********Private Sub DelayTime()Dim bDT As BooleanDim sPrevious As Single, sLast As SinglebDT = TruesPrevious = Timer (Timer可以计算从子夜到现在所经过的秒数,在Microsoft Windows中,Timer函数可以返回一秒的小数部分)Do While bDTIf Timer - sPrevious >= 0.3 Then bDT = FalseLoopbDT = TrueEnd Sub(通信传输速率为9600bps,则最快速度1.04ms发送一个字节,仪表每秒发送50帧数据,每帧数据有4个字节,即每秒发送200个字节,平均5.0ms 发送一个字节,连续读取串口数据时要在程序中添加循环等待程序)Private Sub SwichVar(ByVal nNum As Integer)DelayTimevar = Nullvar = MSC.InputOut(nNum) = var(0)End Sub(设置接收数据模式采用二进制形式,即 InputMode=comInputModeBinary,但用Input属性读取数据时,不能直接赋值给 Byte 类型变量,只能通过先赋值给一个 Variant 类型变量,返回一个二进制数据的数组,再转换保存到Byte 类型数变量中。

c++中的serialport用法

c++中的serialport用法

C++中的SerialPort用法一、概述在C++编程中,SerialPort(串口)是一种常用的通信方式。

它可以用于连接各种外部设备,进行数据传输和通信。

本文将详细介绍在C++中如何使用SerialPort,并且通过实例演示其用法。

二、SerialPort的基本概念1. 串口是一种通过串行通信接口进行数据传输的设备,它通过一根线缆(串口线)进行数据传输。

2. 串口通信有多种标准,如RS-232、RS-485等,不同的标准有不同的电气特性和数据传输速率。

3. 在C++中,可以使用串口库来实现串口通信,常见的串口库有Boost.Asio、Qt SerialPort等。

三、使用Boost.Asio进行串口通信Boost.Asio是一个开源的C++库,用于实现异步I/O操作。

它提供了丰富的网络和串口通信功能,可以方便地进行串口通信开发。

1. 安装Boost库在使用Boost.Asio之前,首先需要安装Boost库。

可以从Boost全球信息站(网络协议sxxx)下载最新版本的Boost库,并按照全球信息站提供的安装说明进行安装。

2. 创建SerialPort对象在C++中使用Boost.Asio库进行串口通信,首先需要创建一个SerialPort对象,并指定串口名称、波特率等参数。

```c++#include <boost/asio.hpp>using namespace boost::asio;// 创建SerialPort对象io_service io;serial_port serial(io, "COM1"); // 指定串口名称serial.set_option(serial_port::baud_rate(9600)); // 设置波特率```3. 读写串口数据创建好SerialPort对象之后,即可通过它进行串口数据的读写操作。

```c++// 向串口写入数据std::string write_data = "Hello, SerialPort!";write(serial, buffer(write_data));// 从串口读取数据char read_data[100];size_t len = read(serial, buffer(read_data, 100));```4. 异步串口通信Boost.Asio库支持异步串口通信,可以通过回调函数处理串口数据的读写操作。

有关JavaScript获取电子秤串口数据的编程代码

有关JavaScript获取电子秤串口数据的编程代码

//绑定事件 fn(); } } catch(err) { alert(err.on(){ functionMSComm1::OnComm(){ MSComm1_OnComm(); } } //事件响应 functionMSComm1_OnComm() {
{ MSComm1=newAcTIveXObject(MSCOMMLib.MSComm.1); if((typeof(MSComm1)==undefined)||(MSComm1==null)) { alert(创建 MSComm1 对象失败!); } else {
{ if(MSComm1.PortOpen==true) { try{MSComm1.PortOpen=false; SKButton1.value=打开串口; }catch(ex) {alert(ex.message);} }
有关 JavaScript 获取电子秤串口数据的编程代码
JavaScript 一种直译式脚本语言,是一种动态类型、弱类型、基于原型的 语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部 分,广泛用于客户端的脚本语言,最早是在 HTML(标准通用标记语言下的 一个应用)网页上使用,用来给 HTML 网页增加动态功能。 本文介绍有关 JavaScript 获取电子秤串口数据的编程代码。 有关 JavaScript 获取电子秤串口数据的完整代码 //创建 MSComm 对象 funcTIonuf_GetSerPortData() { try
else{ try{MSComm1.PortOpen=true; MSComm1.InBufferCount=0; SKButton1.value=关闭串口; }catch(ex) {alert(ex.message);} } }

利用C#通过串口提取GPS定位信息

利用C#通过串口提取GPS定位信息

利用C#通过串口提取GPS定位信息作者:许海峰顔鹏苏仙鹤来源:《硅谷》2013年第02期摘要: GPS定位信号的提取可以用VB,VC实现,但实际应用时会比较难用。

利用C#语言提供的SerialPort类非常简单地实现了GPS定位信号的提取。

关键词: GPS定位信号;C#;SerialPort全球定位系统(GPS)是一种基于空间卫星导航系统,可在地球上和地球附近提供全天候的位置和时间信息的服务。

GPS系统具有高效率、多功能、高精度、操作简便、应用广泛等特点。

因此,GPS不仅诸多民用领域广泛应用,在军事领域方面应用更为广泛。

1 GPS信号的格式GPS接收机工作时会将接收到的GPS导航定位信息通过串口存放在缓存中。

只有通过编写程序将各个字段的信息从缓存字节流中提取出来,才能将其转化成我们需要的数据。

同任何通讯协议一样,也是通过帧结构完成对各种GPS定位信息的提取。

对于本文所使用的GARMIN GPS天线板,它发送到计算机的数据主要由帧头、帧尾和帧内数据组成。

帧头表明了后续帧内数据结构的组成。

每帧都是用回车符和换行符作为帧尾结束标识。

“$GPRMC”帧包含了经纬度、速度、时间等定位数据,我们可以通过处理帧头为“$GPRMC”的数据来获得我们需要的定位数据。

如果我们需要的数据在其它帧中时,我们则需要处理相应的帧就可以。

处理方法与本文中处理“$GPRMC”帧一样。

帧头为“$GPRMC”帧的结构中主要包含了时间、位置、纬度、日期、速度等信息。

本文通过用C#语言编写了利用串口来提取GPS信息的程序,在实验时采用的GPS76接收,GPS76的指标为:定位时间、定位精度、动态性能、速度精度。

2 利用C#通过串口提取GPS信息作为一个基本的串口通信程序,程序需要包含串口选择,波特率选择,打开,关闭,接受数据,显示。

下面开始具体讲解:第一步,用VS2010创建一个基于C#的winForm项目,并设计界面。

第二步,引入SerialPort的命名间.using System.IO.Ports,并实例化串口对象private SerialPort my = new SerialPort(),定义存储GPS文本信息的变量string gpstext = ""。

串口读取数据的方法

串口读取数据的方法

串口读取数据的方法1.打开串口:首先需要打开串口,通过设备文件或串口号来指定要打开的串口。

```c++#include <stdio.h>#include <fcntl.h>#include <termios.h>int openSerialPort(const char* portName)int fd = open(portName, O_RDWR , O_NOCTTY);if (fd < 0)printf("Failed to open serial port\n");return -1;}//配置串口参数struct termios options;tcgetattr(fd, &options);cfsetispeed(&options, B9600);cfsetospeed(&options, B9600);options.c_cflag ,= (CLOCAL , CREAD);tcsetattr(fd, TCSANOW, &options);return fd;}```2.读取串口数据:打开串口之后,可以通过读取文件描述符来读取串口数据。

```c++int readSerialData(int fd, unsigned char* buffer, int bufferSize)int bytesRead = read(fd, buffer, bufferSize);if (bytesRead < 0)printf("Failed to read serial data\n");}return bytesRead;}```3.解析串口数据:读取到的数据可能是原始的字节流,需要根据具体的协议和数据格式进行解析。

```c++void parseData(unsigned char* buffer, int bufferSize)//解析数据的逻辑}```4.循环读取数据:可以使用循环来不断读取串口数据,并进行解析和处理。

java电子秤读取数据

java电子秤读取数据

package serial;import gnu.io.SerialPort;import java.util.HashMap;public class CommTest {public static void main(String[] args) {HashMap<String, Comparable> params = new HashMap<String, Comparable>(); params.put(SerialReader.PARAMS_PORT, "COM8"); // 端口名称params.put(SerialReader.PARAMS_RATE, 9600); // 波特率params.put(SerialReader.PARAMS_TIMEOUT, 1000); // 设备超时时间1秒params.put(SerialReader.PARAMS_DELAY, 200); // 端口数据准备时间1秒params.put(SerialReader.PARAMS_DATABITS, SerialPort.DATABITS_8); // 数据位params.put(SerialReader.PARAMS_STOPBITS, SerialPort.STOPBITS_1); // 停止位params.put(SerialReader.PARAMS_PARITY, SerialPort.PARITY_NONE); // 无奇偶校验SerialReader sr = new SerialReader(params);CommDataObserver bob = new CommDataObserver("bob");CommDataObserver joe = new CommDataObserver("joe");sr.addObserver(joe);sr.addObserver(bob);}}---------------- 2 -----------------package serial;import mPort;import mPortIdentifier;import gnu.io.NoSuchPortException;import gnu.io.PortInUseException;import gnu.io.SerialPort;import gnu.io.SerialPortEvent;import gnu.io.SerialPortEventListener;import gnu.io.UnsupportedCommOperationException;import java.io.IOException;import java.io.InputStream;import java.util.Enumeration;import java.util.HashMap;import java.util.HashSet;import java.util.Observable;import java.util.TooManyListenersException;/*** 串口数据读取类,用于windows的串口数据读取**/public class SerialReader extends Observable implements Runnable, SerialPortEventListener {static CommPortIdentifier portId;int delayRead = 200;int numBytes; // buffer中的实际数据字节数private static byte[] readBuffer = new byte[4096]; // 4k的buffer空间,缓存串口读入的数据static Enumeration portList;InputStream inputStream;SerialPort serialPort;HashMap serialParams;// 端口读入数据事件触发后,等待n毫秒后再读取,以便让数据一次性读完public static final String PARAMS_DELAY = "delay read"; // 延时等待端口数据准备的时间public static final String PARAMS_TIMEOUT = "timeout"; // 超时时间public static final String PARAMS_PORT = "port name"; // 端口名称public static final String PARAMS_DATABITS = "data bits"; // 数据位public static final String PARAMS_STOPBITS = "stop bits"; // 停止位public static final String PARAMS_PARITY = "parity"; // 奇偶校验public static final String PARAMS_RATE = "rate"; // 波特率/*** 初始化端口操作的参数.*** @see*/public SerialReader(HashMap params) {serialParams = params;init();}private void init() {try {// 参数初始化int timeout = Integer.parseInt(serialParams.get(PARAMS_TIMEOUT).toString());int rate = Integer.parseInt(serialParams.get(PARAMS_RATE).toString());int dataBits = Integer.parseInt(serialParams.get(PARAMS_DATABITS).toString());int stopBits = Integer.parseInt(serialParams.get(PARAMS_STOPBITS).toString());int parity = Integer.parseInt(serialParams.get(PARAMS_PARITY).toString());delayRead = Integer.parseInt(serialParams.get(PARAMS_DELAY).toString());String port = serialParams.get(PARAMS_PORT).toString();// 打开端口portId = CommPortIdentifier.getPortIdentifier(port);serialPort = (SerialPort) portId.open("SerialReader", timeout);inputStream = serialPort.getInputStream();serialPort.addEventListener(this);serialPort.notifyOnDataAvailable(true);serialPort.setSerialPortParams(rate, dataBits, stopBits, parity);} catch (PortInUseException e) {System.out.println("端口已经被占用!");e.printStackTrace();} catch (TooManyListenersException e) {System.out.println("端口监听者过多!");e.printStackTrace();} catch (UnsupportedCommOperationException e) {System.out.println("端口操作命令不支持!");e.printStackTrace();} catch (NoSuchPortException e) {System.out.println("端口不存在!");e.printStackTrace();} catch (IOException e) {e.printStackTrace();}Thread readThread = new Thread(this);readThread.start();}/*** Method declaration*** @see*/public void run() {try {Thread.sleep(100);} catch (InterruptedException e) {}}/*** Method declaration*** @param event** @see*/public void serialEvent(SerialPortEvent event) {try {// 等待1秒钟让串口把数据全部接收后在处理Thread.sleep(delayRead);System.out.print("serialEvent[" + event.getEventType() + "] "); } catch (InterruptedException e) {e.printStackTrace();}switch (event.getEventType()) {case SerialPortEvent.BI: // 10case SerialPortEvent.OE: // 7case SerialPortEvent.FE: // 9case SerialPortEvent.PE: // 8case SerialPortEvent.CD: // 6case SerialPortEvent.CTS: // 3case SerialPortEvent.DSR: // 4case SerialPortEvent.RI: // 5case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2break;case SerialPortEvent.DATA_AVAILABLE: // 1try {// 多次读取,将所有数据读入// while (inputStream.available() > 0) {// numBytes = inputStream.read(readBuffer);// }numBytes = inputStream.read(readBuffer);changeMessage(readBuffer, numBytes);} catch (IOException e) {e.printStackTrace();}break;}}// 通过observer pattern将收到的数据发送给observer// 将buffer中的空字节删除后再发送更新消息,通知观察者public void changeMessage(byte[] message, int length) {setChanged();byte[] temp = new byte[length];System.arraycopy(message, 0, temp, 0, length);// System.out.println("msg[" + numBytes + "]: [" + new String(temp) + "]"); notifyObservers(temp);}static void listPorts() {Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();while (portEnum.hasMoreElements()) {CommPortIdentifier portIdentifier = (CommPortIdentifier) portEnum.nextElement(); System.out.println(portIdentifier.getName() + " - "+ getPortTypeName(portIdentifier.getPortType()));}}static String getPortTypeName(int portType) {switch (portType) {case CommPortIdentifier.PORT_I2C:return "I2C";case CommPortIdentifier.PORT_PARALLEL:return "Parallel";case CommPortIdentifier.PORT_RAW:return "Raw";case CommPortIdentifier.PORT_RS485:return "RS485";case CommPortIdentifier.PORT_SERIAL:return "Serial";default:return "unknown type";}}/*** @return A HashSet containing the CommPortIdentifier for all serial ports that are not * currently being used.*/public static HashSet<CommPortIdentifier> getAvailableSerialPorts() {HashSet<CommPortIdentifier> h = new HashSet<CommPortIdentifier>(); Enumeration thePorts = CommPortIdentifier.getPortIdentifiers();while (thePorts.hasMoreElements()) {CommPortIdentifier com = (CommPortIdentifier) thePorts.nextElement();switch (com.getPortType()) {case CommPortIdentifier.PORT_SERIAL:try {CommPort thePort = com.open("CommUtil", 50);thePort.close();h.add(com);} catch (PortInUseException e) {System.out.println("Port, " + com.getName() + ", is in use.");} catch (Exception e) {System.out.println("Failed to open port " + com.getName() + e);}}}return h;}}---------- 3 -----------------package serial;import java.util.Observable;import java.util.Observer;class CommDataObserver implements Observer {String name;public CommDataObserver(String name) { = name;}public void update(Observable o, Object arg) {System.out.println("[" + name + "] GetMessage:\n [" + new String((byte[]) arg) + "]"); }}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

using System;using System.IO.Ports;using System.Text;using System.Threading;/// <summary>/// 封装COM口数据/// </summary>public class ComInformation{string _wdata;string _wunit;string _qdata;string _qunit;string _percentage;/// <summary>/// 获取或设置重量/// </summary>public string WData { get { return this._wdata; } set { this._wdata = value; } }/// <summary>/// 获取或设置重量单位/// </summary>public string WUnit { get { return this._wunit; } set { this._wunit = value; } }/// <summary>/// 获取或设置数量/// </summary>public string QData { get { return this._qdata; } set { this._qdata = value; } }/// <summary>/// 获取或设置数量单位/// </summary>public string QUnit { get { return this._qunit; } set { this._qunit = value; } }/// <summary>/// 获取或设置百分数/// </summary>public string Percentage { get { return this._percentage; } set { this._percentage =value; }}}/// <summary>/// 电子称数据读取类/// </summary>public class WeightReader : IDisposable#region 字段、属性与构造函数SerialPort sp;int _speed = 300;/// <summary>/// 获取或设置电脑取COM数据缓冲时间,单位毫秒/// </summary>public int Speed{get{return this._speed;}set{if (value < 300)throw new Exception("串口读取缓冲时间不能小于300毫秒!");this._speed = value;}}public bool InitCom(string PortName){return this.InitCom(PortName, 4800, 300);}/// <summary>/// 初始化串口/// </summary>/// <param name="PortName">数据传输端口</param>/// <param name="BaudRate">波特率</param>/// <param name="Speed">串口读数缓冲时间</param>/// <returns></returns>public bool InitCom(string PortName, int BaudRate,int Speed){try{sp = new SerialPort(PortName, BaudRate, Parity.None, 8);sp.ReceivedBytesThreshold = 10;sp.Handshake = Handshake.RequestToSend;sp.Parity = Parity.None;sp.ReadTimeout = 600;sp.WriteTimeout = 600;this.Speed = Speed;if (!sp.IsOpen){sp.Open();}return true;}catch{throw new Exception(string.Format("无法初始化串口{0}!",PortName));}}#endregion#region 串口数据读取方法public WeightInformation ReadInfo(){string src = this.ReadCom();WeightInformation info = new WeightInformation();info.WData = this.DecodeWeightData(src);info.WUnit = this.DecodeWeightUnit(src);info.Percentage = this.DecodePercentage(src);info.QData = this.DecodeQualityData(src);info.QUnit = this.DecodeQualityUnit(src);return info;}/// <summary>/// 将COM口缓存数据全部读取/// </summary>/// <returns></returns>private string ReadCom()//返回信息{if (this.sp.IsOpen){Thread.Sleep(this._speed);string res = "";//for (int i = 0; i < 5; i++)//{byte[] buffer = new byte[sp.BytesToRead];sp.Read(buffer, 0, buffer.Length);res = System.Text.Encoding.ASCII.GetString(buffer);//if (res != "")// break;//}if (res == ""){throw new Exception("串口读取数据为空,参数设置是否正确!");}return res;}return "";}#endregion#region 基本取数方法/// <summary>/// 从字符串中取值/// </summary>/// <param name="head">起始字符串</param>/// <param name="intervalLen">间隔位长度</param>/// <param name="valueLen">值长度</param>/// <param name="src">源字符串</param>/// <returns></returns>private string DecodeValue(string head, int intervalLen, int valueLen,string src) {int index = src.IndexOf(head);return src.Substring(index + intervalLen, valueLen);}/// <summary>/// 取重量/// </summary>/// <param name="srcString">源字符串</param>/// <returns></returns>private string DecodeWeightData(string srcString){return this.DecodeValue("GS,", 3, 8,srcString);}/// <summary>/// 取重量单位/// </summary>/// <param name="srcString">源字符串</param>/// <returns></returns>private string DecodeWeightUnit(string srcString){return this.DecodeValue("GS,", 12, 2, srcString);}/// <summary>/// 取百分数/// </summary>/// <param name="srcString">源字符串</param>/// <returns></returns>private string DecodePercentage(string srcString){return this.DecodeValue("U.W.", 4, 14, srcString);}/// <summary>/// 取数量/// </summary>/// <param name="srcString">源字符串</param>/// <returns></returns>private string DecodeQualityData(string srcString){return this.DecodeValue("PCS", 3, 9, srcString);}/// <summary>/// 取数量单位/// </summary>/// <param name="srcString">源字符串</param>/// <returns></returns>private string DecodeQualityUnit(string srcString){return this.DecodeValue("PCS", 12, 3, srcString);}#endregion#region 释放所有资源public void Dispose(){if (sp != null && sp.IsOpen){sp.Close();}}#endregion}。

相关文档
最新文档