怎样在VB中对多个下位机实现多机通信,要求的是发送的奇偶校验位为1,怎么做?在给等待。 我要用VB写多机通信的上位机通信程序,但是VB中只有一个MSCOMM不能实现谁有办法帮个忙。但是想了一下可以用C写一个发送程序做成的DLL的文件,可是做不出来,大家帮个忙吧! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 HANDLE hidcomdrv;bool opened=false ;extern"C"_declspec(dllexport)bool open(int nport,LPSTR Settings){ if (opened) return(true); char spname[8]; DWORD dwerror; DCB dcb; wsprintf(spname,"COM%d",nport); hidcomdrv=::CreateFile(spname,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL); if (hidcomdrv==INVALID_HANDLE_VALUE) { dwerror=::GetLastError(); AfxMessageBox("Can not Open Comm"); return(false); } if(::GetCommState(hidcomdrv,&dcb)) { dcb.BaudRate=9600; dcb.ByteSize =8; dcb.fParity =0; dcb.StopBits =0; dcb.Parity =0;// ::Beep(500,100); if(!::SetCommState(hidcomdrv,&dcb)) { AfxMessageBox("Can not Open Comm"); return(false); } else { opened=true; AfxMessageBox(" Com is Opened"); return(opened); } } else { opened=false; AfxMessageBox(" Com is not Opened"); return(opened); } }extern"C"_declspec(dllexport)bool close(){ if(!opened||hidcomdrv==NULL)return(true); ::PurgeComm(hidcomdrv,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); ::EscapeCommFunction(hidcomdrv,CLRDTR); ::CloseHandle (hidcomdrv); AfxMessageBox("Comm is Colsed"); opened=false; hidcomdrv=NULL; return(true);}extern"C"_declspec(dllexport)int readStr(LPSTR buffer){ int rlen; if (!opened||hidcomdrv==NULL)return(0); DWORD dwbytesread,dwerrorflags; COMSTAT comstat; static OVERLAPPED ovread; ::ClearCommError (hidcomdrv,&dwerrorflags,&comstat); dwbytesread=(DWORD)comstat.cbInQue ; rlen=(int)dwbytesread; ::Beep(500,100); if (rlen>300) { dwbytesread=(DWORD)300; } if(!::ReadFile(hidcomdrv,buffer,dwbytesread,&dwbytesread,&ovread)) { ::GetLastError (); ::Beep(5000,1000); return(0); } else { rlen=(int)dwbytesread; ::Beep(500,100); return(rlen); }}extern"C"_declspec(dllexport)int writeStr(LPSTR buffer,int wlen){// char spname[8]; if (!opened||hidcomdrv==NULL)return(0); DWORD dwbyteswritten=0; static OVERLAPPED ovwrite; dwbyteswritten=(DWORD)wlen; if(!::WriteFile (hidcomdrv,buffer,dwbyteswritten,&dwbyteswritten,&ovwrite)) { ::GetLastError(); ::Beep(5000,1000); return(0); } else {// wsprintf(spname,"Ret%d",(int)dwbyteswritten);// AfxMessageBox(" "); ::Beep(500,100); return((int)dwbyteswritten); }}extern"C"_declspec(dllexport)bool settime(int time){ LPCOMMPROP cp; COMMTIMEOUTS to; cp=(LPCOMMPROP)malloc(1000); if(!::GetCommProperties(hidcomdrv,cp)) { return(false); } if (!(cp->dwProvCapabilities &PCF_TOTALTIMEOUTS)) { AfxMessageBox("Comm OUTTIME SET IS CLOSED"); return(false); } to.ReadIntervalTimeout =0; to.ReadTotalTimeoutMultiplier =0; to.ReadTotalTimeoutConstant =time; to.WriteTotalTimeoutMultiplier =0; to.WriteTotalTimeoutConstant =time;// ::Beep(500,100); if(!::SetCommTimeouts (hidcomdrv,&to)) { return(false); } return (true);} gys_yxr(毛毛) 给他个DLL和调用说明不就行了,偶没搞过,但偶是学机械的,将来肯定要接触这方面的东西,学习。 用API函数打开串口进行通讯,这样灵活得多 麻烦高手帮我看看这段代码 VB 上传图片附件保存到数据库中 创建程序的快捷方式 网络视频问题 为什么一点击datagrid的标题,数据就全没了(数据是从数据库中查出的) 想购买一个织布厂的进销存,哪位能推荐一下! 如何打印datagrid中的数据。谢谢 Collection的问题 如何获得PB或者其他工具编写的软件某个控件的内容? 异类报表如何实现,请指教 求VB写的计算器程序之2 实时错误‘49’,DLL调用约定错误?急急急,一定感谢!!!急急急,一定感谢!!
bool opened=false ;
extern"C"_declspec(dllexport)bool open(int nport,LPSTR Settings)
{ if (opened) return(true);
char spname[8];
DWORD dwerror;
DCB dcb;
wsprintf(spname,"COM%d",nport);
hidcomdrv=::CreateFile(spname,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
if (hidcomdrv==INVALID_HANDLE_VALUE)
{
dwerror=::GetLastError();
AfxMessageBox("Can not Open Comm");
return(false);
}
if(::GetCommState(hidcomdrv,&dcb))
{
dcb.BaudRate=9600;
dcb.ByteSize =8;
dcb.fParity =0;
dcb.StopBits =0;
dcb.Parity =0;
// ::Beep(500,100);
if(!::SetCommState(hidcomdrv,&dcb))
{
AfxMessageBox("Can not Open Comm");
return(false);
}
else
{
opened=true;
AfxMessageBox(" Com is Opened");
return(opened);
}
}
else
{
opened=false;
AfxMessageBox(" Com is not Opened");
return(opened);
}
}
extern"C"_declspec(dllexport)bool close()
{
if(!opened||hidcomdrv==NULL)return(true);
::PurgeComm(hidcomdrv,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
::EscapeCommFunction(hidcomdrv,CLRDTR);
::CloseHandle (hidcomdrv);
AfxMessageBox("Comm is Colsed");
opened=false;
hidcomdrv=NULL;
return(true);
}
extern"C"_declspec(dllexport)int readStr(LPSTR buffer)
{
int rlen;
if (!opened||hidcomdrv==NULL)return(0);
DWORD dwbytesread,dwerrorflags;
COMSTAT comstat;
static OVERLAPPED ovread;
::ClearCommError (hidcomdrv,&dwerrorflags,&comstat);
dwbytesread=(DWORD)comstat.cbInQue ;
rlen=(int)dwbytesread;
::Beep(500,100);
if (rlen>300)
{
dwbytesread=(DWORD)300;
}
if(!::ReadFile(hidcomdrv,buffer,dwbytesread,&dwbytesread,&ovread))
{
::GetLastError ();
::Beep(5000,1000);
return(0);
}
else
{
rlen=(int)dwbytesread;
::Beep(500,100);
return(rlen);
}
}
extern"C"_declspec(dllexport)int writeStr(LPSTR buffer,int wlen)
{
// char spname[8];
if (!opened||hidcomdrv==NULL)return(0);
DWORD dwbyteswritten=0;
static OVERLAPPED ovwrite;
dwbyteswritten=(DWORD)wlen;
if(!::WriteFile (hidcomdrv,buffer,dwbyteswritten,&dwbyteswritten,&ovwrite))
{
::GetLastError();
::Beep(5000,1000);
return(0);
}
else
{
// wsprintf(spname,"Ret%d",(int)dwbyteswritten);
// AfxMessageBox(" ");
::Beep(500,100);
return((int)dwbyteswritten);
}
}
extern"C"_declspec(dllexport)bool settime(int time)
{
LPCOMMPROP cp;
COMMTIMEOUTS to;
cp=(LPCOMMPROP)malloc(1000);
if(!::GetCommProperties(hidcomdrv,cp))
{
return(false);
}
if (!(cp->dwProvCapabilities &PCF_TOTALTIMEOUTS))
{
AfxMessageBox("Comm OUTTIME SET IS CLOSED");
return(false);
}
to.ReadIntervalTimeout =0;
to.ReadTotalTimeoutMultiplier =0;
to.ReadTotalTimeoutConstant =time;
to.WriteTotalTimeoutMultiplier =0;
to.WriteTotalTimeoutConstant =time;
// ::Beep(500,100);
if(!::SetCommTimeouts (hidcomdrv,&to))
{
return(false);
}
return (true);
}