卖萌de可达鸭 2019-06-15 11:07 采纳率: 0%
浏览 381

c#调联迪MisPos.dll的问题

之前没用过C#,目前也是边学边开发,网上关于联迪读卡器、Pos的资料少之又少,研究了好几天还是没有调通,希望有调过联迪dll的大神指点一下!

1、dll函数说明:
int __stdcall BankTrans(char * InputData, char* OutPutData)

输入参数InputData:
typedef struct
{
    char trans[2];    /*交易类型:(  '10'-获取卡号  '00'-签到 '01'-消费 '02'-消费撤销  '03'- 隔日退货  '04'-查询  '05-重打印  '06-结算 '07'-批量退货 )*/
  char CardType[2];  /*卡类型*/
    char amount[12];        /* 金额(12字节,无小数点,左补0,单位:分)*/
    char card_no[20];     /*卡号  (20字节,左对齐,不足部分补空格)*/
    char old_reference[12];   /*原交易参考号*/
    char old_trace[6];   /*原交易流水号*/
    char UserNO[15];    /*原交易商户号*/
    char TerNO[15]; /*原交易终端号*/
    char Date[8];       /*原交易日期yyyymmdd*/
    char VerifyInfo[300]; // 认证数据
} InputData;


输出 OutPutData,结构体如下
typedef struct   
{
    char resp_code[2];/*0~1位    返回码   ( 2字节, "00"成功)*/
    char card_no[20];/*卡号   (20字节,左对齐,不足部分补空格)*/
    char amount[12];/*  金额(12字节,无小数点,左补0,单位:分)*/
        char reference[12]; /*交易参考号*/
    char trace[6];   /*流水号  (6字节,左对齐)*/
    char UserNO[15];    /*商户号*/
    char TerNO[15]; /*终端号*/
        char CardType[2];  /*卡类型*/
    char expr[4];/*有效期    (4字节) */
    char BatchNo[10];/*批次号*/
    char Date[8];       /*交易日期yyyymmdd*/
    char Time[6];       /*交易时间hhmmss*/ 
    char CardName[20];  /*发卡行中文名*/
    char old_amount[12];/*  原交易金额(12字节,无小数点,左补0,单位:分)*/
        char old_reference[12];   /*原交易参考号 */
    char old_trace[6];   /*原交易流水号*/
        char old_UserNO[15];    /*原交易商户号*/
    char old_TerNO[15]; /*原交易终端号*/
    char old_Date[8];       /*原交易日期yyyymmdd*/
    char resp_chin[100];/*86~185位  错误说明(40字节,左对齐,不足部分补空格)*/
} OutPutData;

图片说明

2、我在c#里引用dll方法里是这么定义的

[DllImport("MisPos.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int BankTrans(INPUT_MIS request, StringBuilder response);


 [StructLayout(LayoutKind.Sequential)]
    public struct INPUT_MIS
    {
        /*交易类型:('10'-获取卡号  '00'-签到 '01'-消费 '02'-消费撤销  '03'- 隔日退货  '04'-查询  '05-重打印  '06-结算 '07'-批量退货 )*/
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
        public string trans;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct OUTPUT_MIS
    {
        /*0~1位  返回码   ( 2字节, "00"成功)*/
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)] //这里的2就是数组长度
        public string resp_code;
        /*卡号    (20字节,左对齐,不足部分补空格)*/
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
        public string card_no;
        /*卡类型*/
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
        public string CardType;
        /*错误说明*/
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
        public string resp_chin;
    }

输入输出类型定义为 结构体、StringBuilder还是 IntPtr ?? 我都试了一遍

3、具体调用:

     INPUT_MIS input = new INPUT_MIS();
                       StringBuilder output = new StringBuilder(2000);
                       input.trans = "10";
                       //调用
                       int result = LDE820D.LDE820D.BankTrans(input, output);
                       MessageBox.Show("result:" + result + "----" + output);

4、返回结果为:
图片说明

5、联迪设备是串口设备,测试demo需要根据自己电脑设备管理器修改串口号,这种设备是可以直接调dll还是通过打开串口那种模式开发。
像神思的设备直接调dll就可以驱动读卡器读卡,扫码墩切成串口模式就需要通过打开串口来接收数据,联迪的这种应该怎么弄呢????

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
    • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
    • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
    • ¥30 3天&7天&&15天&销量如何统计同一行
    • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
    • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
    • ¥15 vs2019中数据导出问题
    • ¥20 云服务Linux系统TCP-MSS值修改?
    • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
    • ¥20 怎么在stm32门禁成品上增加查询记录功能