扫描仪串口程序开发总结
由于公司新展开一个业务,需要用到扫描仪,买来的是个USB口的,可是我们应用程序界面上是没有光标的,需要USB转 COM口后,再用程序来读串口的数据,买的这个扫描枪型号是Metrologic的 M S5415,随附的扫描仪设置手册里有个条码是:设置扫描仪USB模拟串口输出(需装驱动),扫一下就可以将扫描仪的USB 转换成COM口.用扫描仪扫一下这个条目后,我的电脑设备管理器出现一个其它设备,黄色的,然后更新驱动程序,找到官方网站下载的驱动后,确定,一会驱动安装完成,扫描仪出现一声响,此时在我的电脑,设备管理器的端口下的列表里出现了个COM3.这个COM3就是现在的扫描仪了。此时再通过程序监视COM3的数据。
通过.NET的SerialPort类可以实现该功能, 以下是我测试用的一个DEMO程序,根据《C# 与VB.NET网络通信开发实战》完成的一个DEMO,该书的第二章有详细串口通信解释.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports; namespace MetrologicClient { public partial class Form2 : Form { private System.IO.Ports.SerialPort serialPort = new System.IO.Ports.SerialPort(); public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(DataReceived);// .SerialDataReceivedEventHandler(DataReceived); string[] portNames = System.IO.Ports.SerialPort.GetPortNames(); for (int i = 0; i <= portNames.Length - 1; i++) { cbbCOMPorts.Items.Add(portNames[i]); } btnDisconnect.Enabled = false; } private void btnConnect_Click(object sender, EventArgs e) { if (serialPort.IsOpen) { serialPort.Close(); } try { serialPort.PortName = cbbCOMPorts.Text; serialPort.BaudRate = 9600; serialPort.Parity = System.IO.Ports.Parity.None; serialPort.DataBits = 8; serialPort.StopBits = System.IO.Ports.StopBits.One; serialPort.Open(); lblMessage.Text = cbbCOMPorts.Text + " connected. "; btnConnect.Enabled = false; btnDisconnect.Enabled = true; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } private void btnDisconnect_Click(object sender, EventArgs e) { try { serialPort.Close(); lblMessage.Text = serialPort.PortName + " disconnected. "; btnConnect.Enabled = true; btnDisconnect.Enabled = false; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } private void btnSend_Click(object sender, EventArgs e) { try { serialPort.Write(txtDataToSend.Text + Environment.NewLine); txtDataReceived.AppendText(">" + txtDataToSend.Text + Environment.NewLine ); txtDataReceived.ScrollToCaret(); txtDataToSend.Text = string.Empty; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } private void DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { txtDataReceived.BeginInvoke(new myDelegate(updateTextBox)); } public delegate void myDelegate(); public void updateTextBox() { txtDataReceived.AppendText(serialPort.ReadExisting() + " test " ); txtDataReceived.ScrollToCaret(); } } }
以上程序在扫描不足8位的条形码是没有问题,在像水、电的催款单上面条形码都要30多位数字,可是扫出来的条形码还是只有8位,后来在程序中停了一下线程就可以了。
如以下程序
public delegate void myDelegate(); public void updateTextBox() { System.Threading.Thread.Sleep(1000); txtDataReceived.AppendText(serialPort.ReadExisting() + " test " ); txtDataReceived.ScrollToCaret(); }
以上只是解决扫描枪USB模拟COM口的技术问题,在放到实际应用中,问题不止这点,我需要在WIN FORM程序中完成串口程序,接收到串口的数据以后,传到WIN FORM程序中的Browser控件里的网页程序,其中网页程序中有Javascript来接收,JS程序如下
function toNextPage(obj) { var now_iframe = window.document.getElementById('iframe1'); now_iframe.contentWindow.location = "Payment_gas.aspx?barcode=" + obj; // return; } WIN FORM 中调用WEB程序中Javascript的程序如下 code4 mshtml.IHTMLDocument2 currentDoc = (mshtml.IHTMLDocument2) CurrendWB.Document.DomDocument; mshtml.IHTMLWindow2 win = (mshtml.IHTMLWindow2) currentDoc.parentWindow; win.execScript("toNextPage(\""+ unstring +"\")", "javascript");
问题出在下面这一句
win.execScript("toNextPage(\""+ unstring +"\")", "javascript");
变量 unstring是扫描仪扫出来的值,默认情况,扫出来的字符是带回车符的 ,假如unstring是“20110224回车符”这样传进去,到执行Javascript的时候,Javascript程序就会变成如下这样的形式
function toNextPage(“
20110224
”)
这样是不符合Javascript语法的,会出现HRESULT:0x80020101 的语法错误.
如果把这一句话改成
win.execScript("toNextPage("+ unstring +")", "javascript");
在调用的时候,不是把扫描值当成字符,javascript在接收到全是数字的扫描结果就会直接把它当成科学计数法,如果unstring = 8801124811022218270060101700060007,javascript接收到以后直接变成int型的8.801124811022218e 33,失去了原有意义。
只要1000元的专业编程扫描枪:MS3398,技术文档完全,实例简明易懂,快速开发的首选!!
购买地址:www.posunitech.com