111,129
社区成员
发帖
与我相关
我的任务
分享
//直接通过COM口收发数据
typedef struct tagJB_COM_DATA
{
DWORD dwSize;
DWORD dwChannel; //通道号
BOOL bIs485; //485 or 232
char DataBuf[]; //最大128
}JB_COM_DATA;
// 函数
DWORD WINAPI JBNV_SetServerConfig(HANDLE hServer,DWORD dwCmd,LPVOID lpData,DWORD dwSize);// 配置服务器参数
// 下面这个SDKDemo中对上面函数的调用:
DWORD SendPTZControlToServer(
BYTE *lpData, //要发送的COM数据,最多一次256个字节
int nSize //数据长度
)
{
BYTE bComData[280];
JB_COM_DATA *lpcomdata = (JB_COM_DATA *)bComData;
lpcomdata->dwSize = sizeof(int) * 3 + nSize;
lpcomdata->dwChannel = 0;
lpcomdata->bIs485 = TRUE;
memcpy(lpcomdata->DataBuf,lpData,nSize);
JBNV_SetServerConfig(m_hServer, //服务器句柄
CMD_SEND_COMDATA,lpcomdata,lpcomdata->dwSize);
return 0;
}
// 结构定义
/// <summary>
/// 直接通过COM口收发数据
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct JBNV_COMData
{
public uint dwSize;
public uint dwChannel;
public bool bIs485;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1, SizeConst = 9)]
public byte[] dataBuf; // 因为只需要传串口命令,我认为这样定义比较方便
// SizeConst为9是因为最长的串口命令是9个字节
}
// 函数声明
[DllImport("JBNVSDK.dll", EntryPoint = "JBNV_SetServerConfig", CharSet = CharSet.Ansi)]
public extern static JBNV_ErrorCode SetServerConfig(IntPtr hServer, JBNV_ParaCMD dwCmd, JBNV_COMData lpData, uint dwSize);
// 函数调用
JBNV_COMData comData = new JBNV_COMData();
comData.dwSize = 12 + 9;
comData.bIs485 = true;
comData.dwChannel = 0;
comData.dataBuf = new byte[9] {0xA0, 0x01, 0x00, 0x03, 0x17, 0x01, 0xFF, 0xFF, 0xE5};
int sz = Marshal.SizeOf(comData); // 这个是调试的时候用来看数据结构大小的
JBNV_ErrorCode re = JBNV_DLLFuction.SetServerConfig(hServer, JBNV_ParaCMD.CMD_SEND_COMDATA, comData, comData.dwSize);
if (re != JBNV_ErrorCode.JB_SUCCESS)
{
re = JBNV_DLLFuction.GetErrorMessage(re, ErrorMsg, 256u, 0x00000804);
MessageBox.Show(ErrorMsg.ToString());
}
// 结构定义
/// <summary>
/// 直接通过COM口收发数据
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct JBNV_COMData
{
public uint dwSize;
public uint dwChannel;
public bool bIs485;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1, SizeConst = 128)]
public byte[] dataBuf; // 因为只需要传串口命令,我认为这样定义比较方便
// SizeConst为9是因为最长的串口命令是9个字节
}
// 函数声明
[DllImport("JBNVSDK.dll", EntryPoint = "JBNV_SetServerConfig", CharSet = CharSet.Ansi)]
public extern static JBNV_ErrorCode SetServerConfig(IntPtr hServer, JBNV_ParaCMD dwCmd, ref JBNV_COMData lpData, uint dwSize);
// 函数调用
public void Test(byte []data)
{
JBNV_COMData comData = new JBNV_COMData();
comData.dwSize = (uint)(12 + data.Length);
comData.bIs485 = true;
comData.dwChannel = 0;
byte[] buffer = new byte[128];
Buffer.BlockCopy(data, 0, buffer, 0, data.Length);
comData.dataBuf = buffer;
JBNV_ErrorCode re = JBNV_DLLFuction.SetServerConfig(hServer, JBNV_ParaCMD.CMD_SEND_COMDATA, comData, comData.dwSize);
if (re != JBNV_ErrorCode.JB_SUCCESS)
{
re = JBNV_DLLFuction.GetErrorMessage(re, ErrorMsg, 256u, 0x00000804);
MessageBox.Show(ErrorMsg.ToString());
}
}
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1, SizeConst = 9)]
public byte[] dataBuf;
//试试把上面这个改成下面这个试试
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]
public string dataBuf;