求多线程串口通讯程序(最好bcb)

dengjunjian 2005-03-16 03:53:17
求多线程串口通讯程序(最好bcb).分不够可以再开贴。
...全文
537 12 打赏 收藏 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sydt2000 2005-05-18
  • 打赏
  • 举报
回复
gz!!!

up!
NetSpider9804040 2005-03-31
  • 打赏
  • 举报
回复
学习中。。。
dengjunjian 2005-03-17
  • 打赏
  • 举报
回复
15ms是完全可以的。
iting 2005-03-17
  • 打赏
  • 举报
回复
看你应用的时间要求了,如果要告诉采集数据,则不行,如果每个机器浪费你15ms是可以忍受的,则可以采用。
dengjunjian 2005-03-17
  • 打赏
  • 举报
回复
To:: iting(倚天)
使用监视线程的方法不很适用于对单片机通讯.


为什么?
atsea1 2005-03-17
  • 打赏
  • 举报
回复
线程间的同步常用方法有:临界段,互斥量,事件和信号量。临界段只能用于单个进程中多个线程的同步,而互斥量可用于多个进程中的线程同步。
iting 2005-03-17
  • 打赏
  • 举报
回复
串口监视线程也是通过API设置串口驱动要报告的事件。如果你的程序的串口是全双工的,读写分开才有实际意义,如果是半双工,则读写最好在一个线程里实现。
使用监视线程的方法不很适用于对单片机通讯。
相关API如下:
SetCommMask
WaitCommEvent
GetCommMask
详细的用法可以在MSDN Lib或者SDK帮助文档中找到。
#include <windows.h>
#include <assert.h>

HANDLE hCom;
OVERLAPPED o;
BOOL fSuccess;
DWORD dwEvtMask;

hCom = CreateFile( "COM1",
GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // default security attributes
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL
);

if (hCom == INVALID_HANDLE_VALUE)
{
// Handle the error.
return;
}

// Set the event mask.

fSuccess = SetCommMask(hCom, EV_CTS | EV_DSR);

if (!fSuccess)
{
// Handle the error.
return;
}

// Create an event object for use in WaitCommEvent.

o.hEvent = CreateEvent(
NULL, // default security attributes
FALSE, // auto reset event
FALSE, // not signaled
NULL // no name
);

assert(o.hEvent);

if (WaitCommEvent(hCom, &dwEvtMask, &o))
{
if (dwEvtMask & EV_DSR)
{
// To do.
}

if (dwEvtMask & EV_CTS)
{
// To do.
}
}
dengjunjian 2005-03-17
  • 打赏
  • 举报
回复
在论坛上搜索到好多的相关帖子。发现串口通讯,最好是4个线程。主线程、串口监视线程、读串口数据线程、写串口数据线程。究竟串口监视线程是怎么监视的?以及怎么同步县城?怎么产生标志事件?请高手指点。
dengjunjian 2005-03-17
  • 打赏
  • 举报
回复
请高手详解一下线程之间是怎么通讯的?
dengjunjian 2005-03-17
  • 打赏
  • 举报
回复
up
icwin 2005-03-16
  • 打赏
  • 举报
回复
mark
atsea1 2005-03-16
  • 打赏
  • 举报
回复
tcomm.cpp
#include "TComm.h"

HANDLE __fastcall TComm::GetComHandle(void)
{
return m_Handle;
}

int __fastcall TComm::Open()
{
String szCom;
COMMTIMEOUTS to;

if(pReadThread)
{
SetCommMask(m_Handle,0);
pReadThread->Terminate();
delete pReadThread;
}
szCom.sprintf("COM%d",m_wComm);
if(m_Handle)
{
CloseHandle(m_Handle);
}
m_Handle = CreateFile(szCom.c_str(),GENERIC_READ|GENERIC_WRITE,
0,NULL,OPEN_EXISTING,
//NULL,
FILE_FLAG_OVERLAPPED, //是否异步执行操作
NULL);
if(m_Handle == INVALID_HANDLE_VALUE)
{
return -1;
}

memset((void *)&to,0,sizeof(COMMTIMEOUTS));

to.ReadTotalTimeoutMultiplier = 5;
to.ReadTotalTimeoutConstant = 1000;
SetCommTimeouts(m_Handle,&to);

if(m_pReadProc)
{
SetCommMask(m_Handle,EV_RXCHAR);
pReadThread = new TReadThread(m_Handle,m_OwnHandle,m_pReadProc,false);

}
return 1;
}

DWORD __fastcall TComm::GetErrorMessage(void)
{
LPVOID lpMsgBuf;
DWORD dwBufLen = 0;

dwBufLen = FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
ZeroMemory(pErrBuf,BUFSIZE);
memcpy(pErrBuf,lpMsgBuf,dwBufLen);
LocalFree( lpMsgBuf );

return dwBufLen;
}

int __fastcall TComm::Close(void)
{
BOOL bReturn;
if(m_Handle)
{
bReturn = CloseHandle(m_Handle);
if(!bReturn)
{
return -1;
}
}
return 1;
}

int __fastcall TComm::DialogSetupComm(void)
{
COMMCONFIG ComConfig;
BOOL bReturn;
String szCom;
DCB dcb;

memset((void *)&dcb,0,sizeof(DCB));
GetCommState(m_Handle,&dcb);

szCom.sprintf("COM%d",m_wComm);
//显示系统配置窗口
bReturn = CommConfigDialog(szCom.c_str(),NULL,&ComConfig);
if(!bReturn) //没有配置
{
return -1;
}
dcb.BaudRate = ComConfig.dcb.BaudRate;
dcb.fParity = ComConfig.dcb.fParity;
dcb.StopBits = ComConfig.dcb.StopBits;
dcb.ByteSize = ComConfig.dcb.ByteSize;
//配置串口波特率等属性
bReturn = SetCommState(m_Handle,&dcb);
if(!bReturn)
{
return -1;
}
return(Open());

}

String __fastcall TComm::GetErrorString(void)
{
DWORD dwReturn;
String str;

GetErrorMessage();
str.sprintf("%s",pErrBuf);
return str;
}

void __fastcall TComm::SetReadEvent(READPROC pReadProc)
{
m_pReadProc = pReadProc;

}

tcomm.h

#ifndef TCOMM_H
#define TCOMM_H
#include "windows.h"
#include "winbase.h"
#include "system.hpp"
#include <assert.h>
#include "readthread.h"

#define BUFSIZE sizeof(char) * 4096
typedef int WINAPI (* READPROC)(HANDLE hwnd,BYTE *pBuf,WORD wBufLen);

class TComm
{
private:
HANDLE m_Handle;
WORD m_wComm;
DWORD m_dwBaud;
WORD m_wDataBit;
WORD m_wParity;
BYTE *pErrBuf;
READPROC m_pReadProc;
class TReadThread *pReadThread;
DWORD __fastcall GetErrorMessage(void);
protected:
HANDLE m_OwnHandle;
public:
__fastcall TComm(HANDLE Handle,WORD wCom = 1):m_Handle(NULL){
pErrBuf =(BYTE *)malloc(BUFSIZE);
m_wComm = wCom;
m_pReadProc = NULL;
assert(pErrBuf != NULL);
ZeroMemory(pErrBuf,BUFSIZE);
m_OwnHandle = Handle;
pReadThread = NULL;

};
__fastcall ~TComm()
{
free((BYTE *)pErrBuf);
if(m_Handle)
{
CloseHandle(m_Handle);
}

if(pReadThread)
{
SetCommMask(m_Handle,0);
pReadThread->Terminate();
delete pReadThread;
}
}
HANDLE __fastcall GetComHandle(void);
int __fastcall Open(void);
int __fastcall Close(void);
int __fastcall DialogSetupComm(void);
String __fastcall GetErrorString(void);
void __fastcall SetReadEvent(READPROC pReadProc);

};

#endif

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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