c#如何从串口获得扫描枪数据

lcx123 2011-02-24 02:36:38
我在做一个条码管理程序,通过计算机串口连接扫描枪获取条码数据。我用超级终端是可以获得条码信息的,但在Word,Excel或记事本都不能取得条码信息。也就是我得用C#做串口编程,读取串口缓存中的信息,但这方面是第一次接触,根本没有任何经验,请高手指点一下,因为事情急,有源码更好。在此先谢谢了。
...全文
7837 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
仙人Szp 2013-05-29
  • 打赏
  • 举报
回复
我用asp.net做的如何将返回的数据显示到lable或者是span上
Ahuaiyang 2013-05-10
  • 打赏
  • 举报
回复
qldsrx,真厉害!!!
woaiyu6464 2012-11-05
  • 打赏
  • 举报
回复
mark一下 以后过来看
yitianlige 2012-05-24
  • 打赏
  • 举报
回复
hehe呵呵
lee_cs_pchic 2012-05-24
  • 打赏
  • 举报
回复
好东西
pingjing_82 2011-06-13
  • 打赏
  • 举报
回复
按照qldsrx提供的代码无法将扫描的数据显示到textBox上,这段代码改了一下以后就可以了。

void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
sb.Append(serialPort.ReadExisting());
int index = sb.ToString().Length;//这里把int index = sb.ToString().IndexOf((char)0xd);改了
if (index > 0)
{
try
{
System.Windows.Forms.SendKeys.SendWait(sb.ToString(0, index) + "~");
}
finally
{
sb.Remove(0, index);//这里把sb.Remove(0, index+1);改了
}
}
}

pingjing_82 2011-06-12
  • 打赏
  • 举报
回复
请问下面这段代码是什么意思呢?

void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
sb.Append(serialPort.ReadExisting());
int index = sb.ToString().IndexOf((char)0xd);
if (index > 0)
{
try
{
System.Windows.Forms.SendKeys.SendWait(sb.ToString(0, index) + "~");
}
finally
{
sb.Remove(0, index + 1);
}
}
}

lcx123 2011-03-01
  • 打赏
  • 举报
回复
是的,我已经测试成功了,感谢各位的指点,尤其是qldsrx,这些代码我弄了一天,现在基本上能理解了。
xixihaha_2011_098 2011-02-28
  • 打赏
  • 举报
回复
现在主流扫码枪,WINDOWS系统都有驱动呀,TEXTBOX,只要有焦点,就可以获取所扫到的信息呀。
qldsrx 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 lcx123 的回复:]
我用的就是VS2008的,是C#。
只要把输入焦点移到那个上面,扫描枪就能输入。你的意思是只要把光标放在这个页面的任何一个文本框里(比如有三个),扫描枪就自动会把内容输入这个文本框了么。
[/Quote]
还没搞定?这个你实际扫描下就知道了啊,你不这么做,怎么知道行不行,反正我代码就是在键盘模拟,把你扫到的东西通过键盘敲到文本框内,自然必须事先焦点移动到那个上面。
yalan 2011-02-28
  • 打赏
  • 举报
回复
没测试环境也没法帮你测程序

你最好换个扫描枪吧,扫的条码直接就是数字,多好
lcx123 2011-02-28
  • 打赏
  • 举报
回复
我用的就是VS2008的,是C#。
只要把输入焦点移到那个上面,扫描枪就能输入。你的意思是只要把光标放在这个页面的任何一个文本框里(比如有三个),扫描枪就自动会把内容输入这个文本框了么。
lcx123 2011-02-25
  • 打赏
  • 举报
回复
我没有用Visual Studio编译器,也不知道怎么用呢,c#我是通过CSDN和网上的一些资料自学的,因此很多都还不知道。
加上这个using指令后通过编译了,那我扫描后怎么把扫描的数据放到TEXT文本框里面呢。
也就是text1.text=哪个字串呢。
问这个我都不好意思,可我真的是不知道。
qldsrx 2011-02-25
  • 打赏
  • 举报
回复
using System.IO.Ports;

如果你用的是Visual Studio编译器,对着那个错误的地方点鼠标右键,可以自动帮你添加using引用的啊
lcx123 2011-02-25
  • 打赏
  • 举报
回复
qldsrx,我测试了你给我程序,
public class RevSerialPort
{
SerialPort serialPort;(此处提示错误,缺少using指令或程序集。)
StringBuilder sb;
public RevSerialPort()

这可能是我缺少了using指令,但我不知道具体是哪个,我现在的指令有:
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;

我现在是这样做的,新建一个窗口,加入一个text文本框,加入serialPort控件:页面

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;


namespace SampleManage.ETI
{
public partial class Frm_BarScanner : Form
{
public Frm_BarScanner()
{
InitializeComponent();
}

RevSerialPort rsp;

public class RevSerialPort
{
SerialPort serialPort; // 此处出现错误:缺少using指令或程序集;
StringBuilder sb;
public RevSerialPort()
{
sb = new StringBuilder();
serialPort = new SerialPort();
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
}

public RevSerialPort(string portName)
{
sb = new StringBuilder();
serialPort = new SerialPort(portName);
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
}

public RevSerialPort(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits)
{
sb = new StringBuilder();
serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
}

void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
sb.Append(serialPort.ReadExisting());
int index = sb.ToString().IndexOf((char)0xd);
if (index > 0)
{
try
{
System.Windows.Forms.SendKeys.SendWait(sb.ToString(0, index) + "~");
}
finally
{
sb.Remove(0, index + 1);
}
}
}

public void Start()
{
serialPort.Open();
}

public void Stop()
{
if (serialPort.IsOpen)
serialPort.Close();
}
}

private void Frm_BarScanner_Load(object sender, EventArgs e)
{
try
{
//如果不是默认的COM1端口,这里需要传入端口号
rsp = new RevSerialPort();
rsp.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

}



}
}

请帮忙看看
qldsrx 2011-02-25
  • 打赏
  • 举报
回复
你要是没有安装过,还是下载一个比较好:http://www.cnblogs.com/cnmawei/archive/2008/02/18/1072749.html
我很奇怪你是用什么在编译,难道是传说中的记事本?那你又是如何添加文本框的?

最后,数据不用你放到TextBox里面,你只要把输入焦点移到那个上面,也就是键盘可以在上面输入内容的状态,扫描枪就可以直接在上面输入内容了。
l13873666736 2011-02-24
  • 打赏
  • 举报
回复
做一个读串口的不难,网上找一下C# 读串口找出一堆来,
也有省事的方法,换个USB,或者键盘口的扫描枪就好了。
qldsrx 2011-02-24
  • 打赏
  • 举报
回复
晕,我记得我是贴过完整的代码的,估计你没找到,我再贴一遍吧。

public class RevSerialPort
{
SerialPort serialPort;
StringBuilder sb;
public RevSerialPort()
{
sb = new StringBuilder();
serialPort = new SerialPort();
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
}

public RevSerialPort(string portName)
{
sb = new StringBuilder();
serialPort = new SerialPort(portName);
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
}

public RevSerialPort(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits)
{
sb = new StringBuilder();
serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
}

void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
sb.Append(serialPort.ReadExisting());
int index = sb.ToString().IndexOf((char)0xd);
if (index > 0)
{
try
{
System.Windows.Forms.SendKeys.SendWait(sb.ToString(0, index) + "~");
}
finally
{
sb.Remove(0, index + 1);
}
}
}

public void Start()
{
serialPort.Open();
}

public void Stop()
{
if (serialPort.IsOpen)
serialPort.Close();
}
}

使用时,在主窗体加载事件中直接开启,主窗体关闭时关闭:

RevSerialPort rsp;

private void MainForm_Load(object sender, EventArgs e)
{
try
{
//如果不是默认的COM1端口,这里需要传入端口号
rsp = new RevSerialPort();
rsp.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (rsp != null)
rsp.Stop();
}
yalan 2011-02-24
  • 打赏
  • 举报
回复
如果你的记事本都没能捕获扫描枪的消息,那么解决起来恐怕就复杂了~~~~

还是换个枪把。
只见过扫描出来就是数字的枪,别的没接触过
yalan 2011-02-24
  • 打赏
  • 举报
回复
扫描枪扫描的条码应该直接就是数字,不用捕捉它的。

用过n个扫描枪了,扫描出来直接就是阿拉伯数字
加载更多回复(7)

110,572

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧