private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e)
  {
  System.Threading.Thread.Sleep(100);
  int bytes = sepor.BytesToRead;
  byte[] buffer=new byte[bytes];
  if (bytes == 0)
  {
  return;
  }
  sepor.Read(buffer,0,bytes);
  string srt = string.Empty;
  foreach(byte a in buffer)
  {
  srt += a.ToString();
  }
  textBox1.Text =srt;
    
  }
 private void Form1_Load(object sender, EventArgs e)
  {
  sepor.PortName = "COM4"; //选择串口COM4
  sepor.BaudRate = 4800; //设置通信口参数
  sepor.DataBits = 7; //数据位
  sepor.Parity = System.IO.Ports.Parity.None; //校验位 无校验
  sepor.StopBits = System.IO.Ports.StopBits.One; //停止位 1位
  sepor.ReadBufferSize = 1024;  sepor.Open();
  sepor.ReadExisting(); //设置input从接收缓冲读取全数据
  sepor.ReceivedBytesThreshold = 1; //设置引发OnComm事件的字节长度
  sepor.DiscardInBuffer(); //清楚接受缓冲区
  timer1.Start();
  }
刷卡之后显示出来的数据 是一堆的数字 不是我要的卡号,,请高手解决

解决方案 »

  1.   

    肯定是一堆数字,因为它返回的是BYTE的吧,我估计你转为ASCII码就对了,现在一般都支持的。我用这个读取过电子称的数据,
      

  2.   

    送你一个类,自己写的,功能上实现了串口数据接收后在模拟键盘输入,在你当前选定的文本框里输出,如果你的数据不是以换行符结束的,那么你需要另外修改。
        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();
            }
        }
      

  3.   

    你的了解这个读出来的是ASCII还是16进制?
    我用com口读电子称上的数据过,那是16进制数据,然后把16进制转化成10进制的数就可以,
    不了解你的东西自能给你个思路
      

  4.   

    byte要转成string。
    System.Text.Encoding.Ascii.GetString(byte[]);
      

  5.   

    很简单啊,在你程序的主窗口初始化的时候添加
    RevSerialPort rsp;public Form1()
    {
        InitializeComponent();
        try
        {
            rsp = new RevSerialPort("COM1");//这里指定一个COM口来初始化
            rsp.Start();
        }
        catch (Exception ex)
        {
            XtraMessageBox.Show(ex.Message);
        }
    }void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (rsp != null)
            rsp.Stop();
    }
    其中Form1_FormClosing是对应了FormClosing事件的,自己添加,rsp是全局变量,为了可以在窗口关闭时释放资源。
      

  6.   

    那我要怎么拿到 卡的ID呢  放到textBox里
      

  7.   

    我需要拿卡的ID做判断  如果是管理卡 就退出当前程序  会员卡 就把ID号刷到文本框里
      

  8.   

    怎么把他转成10进制呢  16进制和Ascll吗 我都试过了 
      

  9.   

    private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e)
      {
      System.Threading.Thread.Sleep(100);
      int bytes = sepor.BytesToRead;
      byte[] buffer=new byte[bytes];
      if (bytes == 0)
      {
      return;
      }
      sepor.Read(buffer,0,bytes);
    Encoding.UTF8.GetString(buffer)
      

  10.   

    string SPStr=Encoding.UTF8.GetString(buffer);
      

  11.   

    串口连接的是个什么设备,modem么?
      

  12.   

    strdata = System.Text.Encoding.UTF8.GetString(state.buffer, 0, state.sb);
    Convert.ToString(byte, 16)//转换成十六进制字符
    Convert.ToByte("十六进制字符",16);//转换成十进制数据 
      

  13.   

    让你的textBox处于输入焦点的状态即可。不过我建议你自己读下serialPort_DataReceived函数,稍作改动就可以直接用来对textBox赋值的,有点编程功底的改动下很容易实现的。
      

  14.   

    串口链接的是个id读卡器  10进制刷出来的也是一堆的0和12 请问下大家  我是不是得找厂商问问他们这个硬件的协议啊  我自己这样乱写是不是一直刷不出ID呢
      

  15.   

    private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e)
      {
      System.Threading.Thread.Sleep(100);
      int bytes = sepor.BytesToRead;
      byte[] buffer=new byte[bytes];
      if (bytes == 0)
      {
      return;
      }
      sepor.Read(buffer,0,bytes);
    textBox1.Text =Encoding.UTF8.GetString(buffer);
    这样不行?
      

  16.   

    遇到这种不确定的情况,你可以先用WINDOWS自带的超级终端来测试下输出,如果那样也得不到正确的输出,说明这里面经过了编码,需要手工解码了。
      

  17.   

    我做的是个浏览器 一刷卡 判断ID  如果是管理员卡 就退出浏览器  如果是会员卡 就把ID信息录到有焦点的地方,,,请大家帮我想想办法
      

  18.   

    你读出来的是2进制的撒,需要转换一下才可以
    string strReceivedData="";
    for(int i=0;i<buffer.Length;i++)
    {
    strReceivedData+=(char)(buffer[i].ToString());
    }
      

  19.   

    哦 可以了 我用convet转了  我去试1下 好烦这个东西 妈的 每次测试还要生成安装文件跑到机子上去测试
      

  20.   

    textBox1.Text =sepor.ReadExit();试试
      

  21.   


    没有ReadExit()这个方法哦。ReadExisting有这个  
      

  22.   

    本身 你在DataReceived事件里头更新控件的值  是要写委托的  或者异步  或者在开一个线程去
      

  23.   

            private void Form1_Load(object sender, EventArgs e)
            {            #region 串口工具            GetBox.Focus();            Thread thread = new Thread(CrossThreadFlush);
                thread.IsBackground = true;
                thread.Start();            if (serialPortDeb.IsOpen)
                {
                    MessageBox.Show("串口已打开!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    serialPortDeb.Open();                string[] ports = System.IO.Ports.SerialPort.GetPortNames();
                    for (Int32 i = 0; i < ports.Length; i++)
                    {
                        comboBoxPortN.Items.Add(ports[i]);
                    }
                    comboBoxPortN.Text = ports[0];
                }            OpenP.Visible = false;            #endregion        }        private void CrossThreadFlush()
            {
                while (true)
                {
                    //将sleep和无限循环放在等待异步的外面
                    Thread.Sleep(10);
                    ThreadFunction();
                }
            }        private void ThreadFunction()
            {
                if (this.GetBox.InvokeRequired)//等待异步
                {
                    FlushClient fc = new FlushClient(ThreadFunction);
                    try
                    {
                        this.Invoke(fc);//通过代理调用刷新方法
                    }
                    catch
                    {                }
                }
                else
                {
                    lock (this)
                    {                    if (serialPortDeb.BytesToRead != 0)
                        {
                            if (tabControlCon.SelectedIndex == 0)
                            {                            string GetString = serialPortDeb.ReadExisting().Trim().ToString();
                                GetStringNum = GetStringNum + System.Convert.ToInt32(GetString.Length);
                                GetBox.Text = GetBox.Text + GetString;                            GetNum.Text = GetStringNum.ToString();                            this.GetBox.SelectionStart = this.GetBox.Text.Length;
                                this.GetBox.SelectionLength = 0;
                                this.GetBox.ScrollToCaret();                        }
                        }
                    }
                }
            }
      

  24.   

    按照lz的思路,试试这个,楼上的方法也不错。
    string str = string.Empty;
                for (int Index = 0; Index < buffer.Length;Index++ )
                {
                    str += ((Char)(buffer[Index])).ToString();
                }
    textBox1.Text =str;
      

  25.   

    你直接这样看看  private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e)
      {
         textBox1.Text += serialPort1.ReadExisting();    
      }
      

  26.   

    到底读出来的是什么???LZ贴出来看看嘛,真受不了,省得大家猜闷,有说16进制的,有说2进制的,你把ID贴出来,读出的数据也贴出来嘛!!!