C#怎么写上位机接收指纹模块数据?

andywong008 2014-04-16 03:58:04
我想请教下如何利用C# winform来编写指纹模块(FPM10A)的上位机?如果直接PC-指纹模块这样的连接是不是就不存在什么通讯协议之类的东西?因为我试着用串口调试助手发送数据的时候,直接发送命令,指纹模块就有应答(还是说串口调试助手本来就有协议)?

下面是指纹模块的一些参数以及我自己写的一个还未完成的上位机,希望各位大虾能帮帮看看.可以的话加小弟QQ249478601指导一下,因为本身没这方面基础...弄了很多天了一点进展都没,很失望....

指纹模块参数:
上位机接口 UART
波特率 57600
通讯协议(我在商家给的.C例程里面找到的):
unsigned char FP_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF}; //协议包头
unsigned char FP_Get_Img[6] = {0x01,0x00,0x03,0x01,0x0,0x05}; //获得指纹图像
unsigned char FP_Templete_Num[6] ={0x01,0x00,0x03,0x1D,0x00,0x21 }; //获得模版总数
unsigned char FP_Search[11]={0x01,0x0,0x08,0x04,0x01,0x0,0x0,0x03,0xA1,0x0,0xB2}; //搜索指纹搜索范围0 - 929
unsigned char FP_Search_0_9[11]={0x01,0x0,0x08,0x04,0x01,0x0,0x0,0x0,0x13,0x0,0x21}; //搜索0-9号指纹
unsigned char FP_Img_To_Buffer1[7]={0x01,0x0,0x04,0x02,0x01,0x0,0x08}; //将图像放入到BUFFER1
unsigned char FP_Img_To_Buffer2[7]={0x01,0x0,0x04,0x02,0x02,0x0,0x09}; //将图像放入到BUFFER2
unsigned char FP_Reg_Model[6]={0x01,0x0,0x03,0x05,0x0,0x09}; //将BUFFER1跟BUFFER2合成特征模版
unsigned char FP_Delet_All_Model[6]={0x01,0x0,0x03,0x0d,0x00,0x11};//删除指纹模块里所有的模版
volatile unsigned char FP_Save_Finger[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0B,0x00,0x19};//将BUFFER1中的特征码存放到指定的位置
volatile unsigned char FP_Delete_Model[10]={0x01,0x00,0x07,0x0C,0x0,0x0,0x0,0x1,0x0,0x0}; //删除指定的模版


我自己写的上位机:
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;//这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信。
using System.Timers;

namespace fingerprinttest
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
SerialPort sp = new SerialPort(); //声明一个串口类
private void button1_Click(object sender, EventArgs e)
{
sp.Close();
sp = new SerialPort();
sp.PortName = comboBox1.Text;
sp.BaudRate = 57600;
sp.Open();//打开串口
}

private void button2_Click(object sender, EventArgs e)
{
sp.WriteLine(textBox1.Text);//往串口写数据
}


}
}





我想利用指纹模块来实现考勤功能,就希望能写出一个上位机可以正常对指纹模块发送指令,并且可以接收到指纹模块返送的图像/指纹号等信息.谢谢各位大虾 .....
...全文
512 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
mjp1234airen4385 2014-04-24
  • 打赏
  • 举报
回复
lz的基本功还差不少呢。 写个demo吧。 byte[] bdata = new byte[10];//具体长度你数数吧,字符长度/2 //EF01FFFFFFFF010003010005 bdata[0] = 0xEF; bdata[1] = 0x01; bdata[2] = 0xFF; ...... bdata[n] = 0x05; sp.Write(bdata);//具体方法记不清了,可能还是起始位和长度吧。
andywong008 2014-04-24
  • 打赏
  • 举报
回复
引用 23 楼 mjp1234airen4385 的回复:
lz的基本功还差不少呢。 写个demo吧。 byte[] bdata = new byte[10];//具体长度你数数吧,字符长度/2 //EF01FFFFFFFF010003010005 bdata[0] = 0xEF; bdata[1] = 0x01; bdata[2] = 0xFF; ...... bdata[n] = 0x05; sp.Write(bdata);//具体方法记不清了,可能还是起始位和长度吧。
万分感谢!!!结贴!
arSavior 2014-04-24
  • 打赏
  • 举报
回复
楼上正解,楼主参考着用吧
andywong008 2014-04-23
  • 打赏
  • 举报
回复
引用 19 楼 yls0221 的回复:
楼主耐点心,别着急
时间比较紧急..所以..T.T
andywong008 2014-04-23
  • 打赏
  • 举报
回复
引用 18 楼 Z65443344 的回复:
你问厂家要协议文档,应该能查到你怎么发,收到的数据是什么格式. 如果发送了错误的指令,设备应该会返回给你一串错误码,告诉你是什么错误 比如未定义的指令集,请求的数据过长,等等 当然错误码一般都会比较短,仅仅包含错误信息,而不包含数据 正常通信中还要加入各种校验,以确定返回的数据是正确的. 当然发送的指令也是要有校验的,机器会检验你发送的指令是否完整,避免电磁干扰等改变传输的内容 作为指纹识别装置,返回的数据不会只有这么点吧,就算不是整个以图片的形式发过来,起码也应该是指纹特征点阵
非常感谢!那么一点的应答包是因为我就发送了录入指纹的指令,然后我看用户手册它返送的应答包也正确. 我现在就想实现录入指纹的功能,但是现在的问题就是,我已经打开了串口,我希望把十六进制的EF01FFFFFFFF010003010005发送至串口,应该怎么写这段语句?我用sp.WriteLine("EF01FFFFFFFF010003010005");但是程序报错.... 大神方便加Q请教吗249478601...感激不尽...
andywong008 2014-04-23
  • 打赏
  • 举报
回复
引用 17 楼 mjp1234airen4385 的回复:
从07000302000C开始应该是数据,你查查对应的文档,看看这是什么意思吧
恩恩,谢谢帮助.但是现在的问题就是,我已经打开了串口,我希望把十六进制的EF01FFFFFFFF010003010005发送至串口,应该怎么写这段语句?我用sp.WriteLine("EF01FFFFFFFF010003010005");但是程序报错....
yls0221 2014-04-23
  • 打赏
  • 举报
回复
楼主耐点心,别着急
andywong008 2014-04-22
  • 打赏
  • 举报
回复
没人吗???????????
andywong008 2014-04-22
  • 打赏
  • 举报
回复
自己顶...真的是很菜很菜才问这些很菜的问题..高手不要吝啬你们的知识呀...
於黾 2014-04-22
  • 打赏
  • 举报
回复
你问厂家要协议文档,应该能查到你怎么发,收到的数据是什么格式. 如果发送了错误的指令,设备应该会返回给你一串错误码,告诉你是什么错误 比如未定义的指令集,请求的数据过长,等等 当然错误码一般都会比较短,仅仅包含错误信息,而不包含数据 正常通信中还要加入各种校验,以确定返回的数据是正确的. 当然发送的指令也是要有校验的,机器会检验你发送的指令是否完整,避免电磁干扰等改变传输的内容 作为指纹识别装置,返回的数据不会只有这么点吧,就算不是整个以图片的形式发过来,起码也应该是指纹特征点阵
mjp1234airen4385 2014-04-22
  • 打赏
  • 举报
回复
从07000302000C开始应该是数据,你查查对应的文档,看看这是什么意思吧
mjp1234airen4385 2014-04-22
  • 打赏
  • 举报
回复
你发送的是什么东西,你期望得到什么东西? 你期望得到东西是文字吗?不是的话,那就不能在textbox里显示。
andywong008 2014-04-22
  • 打赏
  • 举报
回复
引用 13 楼 Z65443344 的回复:
串口通信设备即使接到错误的指令,也会有应答,你查协议表,应该能发现那是个错误码 正常串口通信设备接收到任何信息都会应答,而不会无响应,这是方便调试用的,否则不知道出现了什么状况 当然如果是多个设备串联,每个设备有自己地址的,只有对应地址的设备会应答.
就是我传输的是16进制的数据,然后应答包也应该是一串16进制数.但是我不知道怎么去接收并显示这一串16进制数.我从串口发送的命令是 EF01FFFFFFFF010003010005,然后应该返回的指令包是EF01FFFFFFFF07000302000C,但是我就不知道怎么去获取并且显示这一串数字...
andywong008 2014-04-22
  • 打赏
  • 举报
回复
引用 13 楼 Z65443344 的回复:
串口通信设备即使接到错误的指令,也会有应答,你查协议表,应该能发现那是个错误码 正常串口通信设备接收到任何信息都会应答,而不会无响应,这是方便调试用的,否则不知道出现了什么状况 当然如果是多个设备串联,每个设备有自己地址的,只有对应地址的设备会应答.
晕,就算是指令错了也会应答???我现在的情况就是,我在C# winform 用serialPort 去进行对串口的数据传输,我传输的是录入指纹的命令,然后它返回的就是一串乱码,那我能怎么改吗?或者有类似例子可以参考吗.?我的就是一个简单的FPM10A指纹模块的上位机...实现基本功能就行了
於黾 2014-04-22
  • 打赏
  • 举报
回复
串口通信设备即使接到错误的指令,也会有应答,你查协议表,应该能发现那是个错误码 正常串口通信设备接收到任何信息都会应答,而不会无响应,这是方便调试用的,否则不知道出现了什么状况 当然如果是多个设备串联,每个设备有自己地址的,只有对应地址的设备会应答.
andywong008 2014-04-22
  • 打赏
  • 举报
回复
引用 11 楼 yls0221 的回复:
你写的代码有错误,串口接收数据是个事件,你点按钮根本就收不到
我后来改了下,成这样
       
SerialPort sp = new SerialPort(); //声明一个串口类
        private void button1_Click(object sender, EventArgs e)
        {
            if (sp.IsOpen)
            {
                sp.Close();
            } 
            sp = new SerialPort();
            sp.PortName = "COM11";
            sp.BaudRate = 57600;
            sp.Open();//打开串口
        }

       

        private void button2_Click(object sender, EventArgs e)
        {

            byte[] bytes = new byte[textBox1.Text.Length / 2];
            for (int i = 0; i < textBox1.Text.Length; i += 2)
            {
                byte b = Convert.ToByte(textBox1.Text.Substring(i, 2), 16);
                bytes[i / 2] = b;
            }

            sp.Write(bytes,0,10);//往串口写数据(0代表偏移量,亦即数组的起始地址;10代表发送的字节数)

            sp.Encoding = System.Text.Encoding.Unicode;
            string receive = sp.ReadExisting();   //接收串口数据
            
            textBox2.Text = receive;
        }
似乎可以打开串口了,然后我输入的数据也好像转换成16进制了.但是模块返回的应该是一串16进制数,但是在我的文本框里显示的却是乱码.?应该怎么改
yls0221 2014-04-22
  • 打赏
  • 举报
回复
你写的代码有错误,串口接收数据是个事件,你点按钮根本就收不到
andywong008 2014-04-21
  • 打赏
  • 举报
回复
引用 7 楼 lulu23260 的回复:
我没用过C#的串口,刚看了一下,建一个窗口程序,从工具栏拖进来一个serialPort组件,有属性可以设置参数, 放置按钮,实现使用serialPort.write和serialPort.Read收发 有事件DataReceived应该是每收到数据就执行的,就是会自动执行收数据 至于你说的“指纹模块返回来的应答不对...”,你得跟写那一,端代码的人沟通,看看指令格式怎样的,
非常感谢.另外我想问下,拿到一个模块,我应该怎么使用它.?我看用户手册上写着包头+地址吗+包标识+包长度+包内容+校验和,这个是不是就是所谓的通讯协议.?然后当我在编程的时候,是不是往串口直接发送指令,然后用if(serialPort.Read == ....){};这样的语句去实现我想要的功能?
lulu23260 2014-04-21
  • 打赏
  • 举报
回复
我没用过C#的串口,刚看了一下,建一个窗口程序,从工具栏拖进来一个serialPort组件,有属性可以设置参数, 放置按钮,实现使用serialPort.write和serialPort.Read收发 有事件DataReceived应该是每收到数据就执行的,就是会自动执行收数据 至于你说的“指纹模块返回来的应答不对...”,你得跟写那一,端代码的人沟通,看看指令格式怎样的,
andywong008 2014-04-21
  • 打赏
  • 举报
回复
在C#里面怎么调用封装好的DLL???
加载更多回复(5)

110,534

社区成员

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

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

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