C# 如何调用这种DLL啊,uint8_t和DCB对应什么变量?

QQ8772357 2010-03-09 11:52:02
C写的一个DLL


typedef enum { RTU, TCP } type_com_t;

struct win32_ser
{
HANDLE fd;
uint8_t buf[512];
DWORD n_bytes;
};

typedef struct
{
struct win32_ser w_ser;
int fd;
type_com_t type_com;
int debug;
int header_length;
int checksum_length;
int port;
char device[64];
char device[16];
int baud;
uint8_t data_bit;
uint8_t stop_bit;
char parity[5];
uint8_t error_handling;
char ip[16];
DCB old_dcb;
} modbus_param_t;

typedef struct
{
int nb_coil_status;
int nb_input_status;
int nb_input_registers;
int nb_holding_registers;
uint8_t* tab_coil_status;
uint8_t* tab_input_status;
uint16_t* tab_input_registers;
uint16_t* tab_holding_registers;
} modbus_mapping_t;



如何使用c#调用请简明的给段代码,多谢啦, 主要是uint8_t uint16_t DCB 对应什么变量?

在<stdint.h>中找到的uint8_t的定义如下
typedef unsigned char uint8_t; 
...全文
1201 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2010-03-10
  • 打赏
  • 举报
回复
uint8_t用byte,uint16_t用ushort,DCB可以定义为长度为28的byte数组。
xingyuebuyu 2010-03-09
  • 打赏
  • 举报
回复
uint8_t用sbyte来代替,uint16_t用uint16,DCB应该是个struct,你在C/C++ code的头文件中继续找下看怎么声明的
QQ8772357 2010-03-09
  • 打赏
  • 举报
回复
如果有时间的话能给点演示吗? 呵呵呵,c写的东西非要让用c#做界面, 刚接触这种托管于非托管的东西,一头雾水哈~
oushengfen 2010-03-09
  • 打赏
  • 举报
回复
在C#中,就是用byte来代替啊。
qygcom 2010-03-09
  • 打赏
  • 举报
回复
using System.Runtime.InteropServices;
[dllimport("dll的名字")]
C++里的函数名称

StructLayout(LayoutKind.Sequential)]
uint8_t,uint16_t,DCB 用C#做的结构类型 来代替
xingyuebuyu 2010-03-09
  • 打赏
  • 举报
回复
    ///<summary>
///设备控制块结构体类型
///</summary>
[StructLayout(LayoutKind.Sequential)]
public struct DCB
{
///<summary>
/// DCB长度
///</summary>
public int DCBlength;
///<summary>
///指定当前波特率
///</summary>
public int BaudRate;
///<summary>
///标志位
///</summary>
public uint flags;
///<summary>
///未使用,必须为0
///</summary>
public ushort wReserved;
///<summary>
///指定在XON字符发送这前接收缓冲区中可允许的最小字节数
///</summary>
public ushort XonLim;
///<summary>
///指定在XOFF字符发送这前接收缓冲区中可允许的最小字节数
///</summary>
public ushort XoffLim;
///<summary>
///指定端口当前使用的数据位
///</summary>
public byte ByteSize;
///<summary>
///指定端口当前使用的奇偶校验方法,可能为:EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY 0-4=no,odd,even,mark,space
///</summary>
public byte Parity;
///<summary>
///指定端口当前使用的停止位数,可能为:ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS 0,1,2 = 1, 1.5, 2
///</summary>
public byte StopBits;
///<summary>
///指定用于发送和接收字符XON的值 Tx and Rx XON character
///</summary>
public byte XonChar;
///<summary>
///指定用于发送和接收字符XOFF值 Tx and Rx XOFF character
///</summary>
public byte XoffChar;
///<summary>
///本字符用来代替接收到的奇偶校验发生错误时的值
///</summary>
public byte ErrorChar;
///<summary>
///当没有使用二进制模式时,本字符可用来指示数据的结束
///</summary>
public byte EofChar;
///<summary>
///当接收到此字符时,会产生一个事件
///</summary>
public byte EvtChar;
///<summary>
///未使用
///</summary>
public ushort wReserved1;
}
QQ8772357 2010-03-09
  • 打赏
  • 举报
回复
引用 3 楼 xingyuebuyu 的回复:
uint8_t用sbyte来代替,uint16_t用uint16,DCB应该是个struct,你在C/C++ code的头文件中继续找下看怎么声明的


刚查了一下 DCB是串口通讯中的一个结构,原型如下
typedef struct _DCB   // dcb
{
DWORD DCBlength; // sizeof(DCB)
DWORD BaudRate; // current baud rate 指定当前的波特率
DWORD fBinary: 1; // binary mode, no EOF check 指定是否允许二进制模式,WINDOWS 95中必须为TRUE
DWORD fParity: 1; // enable parity checking 指定奇偶校验是否允许
DWORD fOutxCtsFlow: 1; // CTS output flow control 指定CTS是否用于检测发送控制.当为TRUE是CTS为OFF,发送将被挂起
DWORD fOutxDsrFlow: 1; // DSR output flow control 指定DSR是否用于检测发送控制.当为TRUE是DSR为OFF,发送将被挂起
DWORD fDtrControl: 2; // DTR flow control type DTR_CONTROL_DISABLE值将DTR置为OFF, DTR_CONTROL_ENABLE值将DTR置为ON, DTR_CONTROL_HANDSHAKE允许DTR"握手",
DWORD fDsrSensitivity: 1; // DSR sensitivity 当该值为TRUE时DSR为OFF时接收的字节被忽略
DWORD fTXContinueOnXoff: 1; // XOFF continues Tx 指定当接收缓冲区已满,并且驱动程序已经发送出XoffChar字符时发送是否停止.TRUE时,在接收缓冲区接收到缓冲区已满的字节XoffLim且驱动程序已经发送出XoffChar字符中止接收字节之后,发送继续进行。FALSE时,在接收缓冲区接收到代表缓冲区已空的字节XonChar且驱动程序已经发送出恢复发送的XonChar之后,发送继续进行。
DWORD fOutX: 1; // XON/XOFF out flow control TRUE时,接收到XoffChar之后便停止发送.接收到XonChar之后将重新开始
DWORD fInX: 1; // XON/XOFF in flow control TRUE时,接收缓冲区接收到代表缓冲区满的XoffLim之后,XoffChar发送出去.接收缓冲区接收到代表缓冲区空的XonLim之后,XonChar发送出去
DWORD fErrorChar: 1; // enable error replacement 该值为TRUE且fParity为TRUE时,用ErrorChar 成员指定的字符代替奇偶校验错误的接收字符
DWORD fNull: 1; // enable null stripping TRUE时,接收时去掉空(0值)字节
DWORD fRtsControl: 2; // RTS flow control RTS_CONTROL_DISABLE时,RTS置为OFF RTS_CONTROL_ENABLE时, RTS置为ON RTS_CONTROL_HANDSHAKE时,当接收缓冲区小于半满时RTS为ON 当接收缓冲区超过四分之三满时RTS为OFF RTS_CONTROL_TOGGLE时,当接收缓冲区仍有剩余字节时RTS为ON ,否则缺省为OFF
DWORD fAbortOnError: 1; // abort reads/writes on error TRUE时,有错误发生时中止读和写操作
DWORD fDummy2: 17; // reserved 未使用
WORD wReserved; // not currently used 未使用,必须为0
WORD XonLim; // transmit XON threshold 指定在XON字符发送这前接收缓冲区中可允许的最小字节数
WORD XoffLim; // transmit XOFF threshold 指定在XOFF字符发送这前接收缓冲区中可允许的最小字节数
BYTE ByteSize; // number of bits/byte, 4-8 指定端口当前使用的数据位
BYTE Parity; // 0-4=no,odd,even,mark,space 指定端口当前使用的奇偶校验方法,可能为:EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY
BYTE StopBits; // 0,1,2 = 1, 1.5, 2 指定端口当前使用的停止位数,可能为:ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS
char XonChar; // Tx and Rx XON character 指定用于发送和接收字符XON的值
char XoffChar; // Tx and Rx XOFF character 指定用于发送和接收字符XOFF值
char ErrorChar; // error replacement character 本字符用来代替接收到的奇偶校验发生错误时的值
char EofChar; // end of input character 当没有使用二进制模式时,本字符可用来指示数据的结束
char EvtChar; // received event character 当接收到此字符时,会产生一个事件
WORD wReserved1; // reserved; do not use 未使用
} DCB;


像这种嵌套型的结构体如何在c#里使用啊? 谁有弄过呢?

110,577

社区成员

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

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

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