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

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;
}
}
}
}
...全文
381 11 打赏 收藏 转发到动态 举报
写回复
用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的长度打印出来。 有可能拿不到需要的长度, 如果不够,暂存后继续接收,下次接收后拼包。
125kHZ低频卡器功能概述: 本资源中包含卡器原理图及PCB文件、卡器源程序和电脑端上位机源程序卡器可以直接制作使用,可以使用附件中的上位机与卡器进行通信,控制卡器对T5557类卡片进行写操作。对T5557卡片的配置必须为(RF/32,曼侧斯特编码),这也是国内T5557卡的常用配置。要对其他配置的T5557卡片或其他低频卡片(EM4305类和EMID卡片)进行写,硬件上是支持的,只需根据卡片文档修改卡器源程序,下载更新便可。为方便程序更新,硬件电路上已经实现自动下载,使用串口下载程序时无需手动设置BOOT0和BOOT1。 应用场景: 低频RFID主要用在短距离、低成本的应用中,如门禁控制、校园卡、煤气表、水表等。 在相关领域的开发中,可以使用该卡器作为前台管理的设备,对客户卡进行管理。也可以将卡器改成终端设备,如RFID门锁上的卡器,用来验证卡片信息并控制门锁;或煤气表、水表上的卡器,根据卡片内的余量信息控制煤气和水的供应。另外,也可以作为学习曼彻斯特解码的学习工具。 设计思路: 使用STM32F103R8T6输出125kHZ的PWM信号作为载波信号,将信号输入到功率放大电路,在线圈上产生125kHZ的正弦信号。T5557卡片从125kHZ信号中获取能量和控制命令,并根据命令将要传回的信息使用曼彻斯特编码对载波信号进行调制。卡器端的检波电路和滤波放大电路将被调制信号提取处理成单片机能识别的数字信号,输入到STM32F103R8T6的输入捕获功能引脚,再通过STM32F103R8T6将捕获的信号进行曼彻斯特解码,最后将解码信息根据自己设定的通讯协议进行数据打包,发送到电脑上位机。 系统框图: 硬件平台: 1.主控制器:STM32F103R8T6 2.USB转TTL:CH340G 3.模拟电路:LM358 AMS1117-3.3V 125kHZ谐振线圈(345UH线圈搭配4700PF电容)谐振频率在线计算工具 4.蜂鸣器: 3V供电 软件平台: 开发工具:Keil uVision5 上位机编写工具:Microsoft Visual C# 学习版 成本估算: 芯片询价和在线购买链接https://www.bom2buy.com/元器件估算价格约为30元 项目进度: 1.能对AT5557/55567/5577卡片(配置为RF/32,曼彻斯特编码)进行整页,密码和密码写操作; 2.有相应的上位机,方便写指令的发送和数据; 3.上位机与卡器之间通讯加入了数据校验,提高了通讯的可靠性。 未来更新: 1.加入EM4305类和EMID卡片的写功能; 2.加上触摸显示屏和电池,成便携版 3.成袖珍版,加入与手机通讯的接口(OTG或蓝牙)

110,534

社区成员

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

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

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