在做一个刷卡器读卡号程序,串口数据返回不完整,有时候读不到数据,不知道为什么下面是源码.

123YYD 2017-05-12 10:36:14
using DemoSerial;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SerialPort2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private SerialPortClass.readcard areadcarde;
//输出数据格式
public int ReadCardReceive(byte CardType, IntPtr LpRecByt, int LpRecSize)
{
byte[] RecByt = new byte[LpRecSize];
System.Runtime.InteropServices.Marshal.Copy(LpRecByt, RecByt, 0, LpRecSize);
Invoke((MethodInvoker)delegate()
{
textBox1.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fffffff") + " " + "[读卡器接收]:" +
"卡类型:" + CardType.ToString("X2") +
"卡号:" +
SerialPortClass.ByteToHexString(RecByt, LpRecSize, " ") + "\r\n");
});
return 1;
}

private void button2_Click(object sender, EventArgs e)
{
int RetInt = SerialPortClass.rd_close();//调用动态链接库关闭串口
if (RetInt == 0)
{
button1.Enabled = true;
button2.Enabled = true;
}
}

private void button1_Click_1(object sender, EventArgs e)
{
areadcarde = ReadCardReceive;
int ComNum = Convert.ToInt32("3");
int RetInt = SerialPortClass.rd_open(ComNum, areadcarde);
if (RetInt == 0)
{
button1.Enabled = false;
button2.Enabled = true;
}
}
}
}
...全文
405 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
123YYD 2017-12-15
  • 打赏
  • 举报
回复
引用 2 楼 xian_wwq 的回复:
1.串口是个低俗设备,读取频率不宜过高。 2.IO操作一般都需要注意拼包和拆包 建议把byte[] RecByt的长度打印出来。 有可能拿不到需要的长度, 如果不够,暂存后继续接收,下次接收后拼包。
刚刚接触不是很懂,能不能说的通俗一点,嘿嘿
123YYD 2017-12-15
  • 打赏
  • 举报
回复
引用 8 楼 sp1234 的回复:
那你一说“返回不完整”,这就容易产生歧义。 因为刷卡是一个“慢速”操作,测试时不存在“快速操作、每秒几百次操作”的问题,我们测试的时候可能3、5秒钟才刷一下卡,这个时候假设连触发回调的“次数”都少了,就先不用纠结返回数据是否完整问题了。
是这样的:我一开始也以为是读的太快了,我中间大概隔2-3秒去读,有时候就是有蜂鸣声,只是不返回数据,断点后发现就没有运行到数据返回那一行。 我是要去寻卡还是怎么样判断,还是方法不对啊
  • 打赏
  • 举报
回复
那你一说“返回不完整”,这就容易产生歧义。 因为刷卡是一个“慢速”操作,测试时不存在“快速操作、每秒几百次操作”的问题,我们测试的时候可能3、5秒钟才刷一下卡,这个时候假设连触发回调的“次数”都少了,就先不用纠结返回数据是否完整问题了。
  • 打赏
  • 举报
回复
引用 3 楼 u011756552 的回复:
那也就是说读不到正常喽
不管最终结果是不是正常(根本达不到这个要求),至少调用几次ReadCardReceive 方法,这跟你可以测试吧? 不考虑数据问题,起码咱们数数还是应该会的。所以这个问题就从驱动那边去慢慢“解决”吧。
  • 打赏
  • 举报
回复
问给你提供驱动的那个人(哪个公司)。
123YYD 2017-05-14
  • 打赏
  • 举报
回复
我试一下,谢谢!
123YYD 2017-05-14
  • 打赏
  • 举报
回复
哦哦,我不加判断和转换hex的时候就是返回不完整,转换之后就有时候读不到数据
dingzyi 2017-05-13
  • 打赏
  • 举报
回复
定时发送,试一下。
123YYD 2017-05-12
  • 打赏
  • 举报
回复



这是读了5次的结果就只有2次显示了
123YYD 2017-05-12
  • 打赏
  • 举报
回复
那也就是说读不到正常喽
xian_wwq 2017-05-12
  • 打赏
  • 举报
回复
1.串口是个低俗设备,读取频率不宜过高。 2.IO操作一般都需要注意拼包和拆包 建议把byte[] RecByt的长度打印出来。 有可能拿不到需要的长度, 如果不够,暂存后继续接收,下次接收后拼包。

111,097

社区成员

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

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

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