社区
网络及通讯开发
帖子详情
求多线程串口通讯程序(最好bcb)
dengjunjian
2005-03-16 03:53:17
求多线程串口通讯程序(最好bcb).分不够可以再开贴。
...全文
537
12
打赏
收藏
求多线程串口通讯程序(最好bcb)
求多线程串口通讯程序(最好bcb).分不够可以再开贴。
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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
关于在C++ Builder中
串口通讯
的经验之谈
第一次:开始的时候,我是因为
BCB
强大制作界面的功能吸引而抛弃了VB的,如果您也打算用
BCB
做串口的东西,那么,请好好看看我的经验。(我只谈串口部分),相信不少的人都知道在VB中有一个控件MSComm(图标是一个小黄电话),它可以帮你完成普通的串口传输功能(比如字符串什么的,但有的却实现起来比较烦琐),在
BCB
中要用VB的控件,我想很多人都知道怎么办,在菜单中点Component>Impo
BCB
串口调试经验
本人新入行,写的也只是很肤浅的自己的一点点理解。欢迎批评指正,qq:15065328.email:zxiki@163.com。msn:zxiki@hotmail.com。如果这些经验能对您有所帮助,我将非常荣幸。欢迎转载(可能抬举自己了),但请把以上文字一并保留。谢谢! 项目(先这么称呼吧)简介,简单的来说就是计算机通过串口分别控制4个二极管的亮度。上位机部分:只说说我用到的一些函数,和
串口处理c#
https://www.cnblogs.com/candylakers/archive/2011/12/30/2306930.html
串口通讯
会产生多条数据连续接收或接收不完整的情况。可以用一个全局变量来累加接收结果,再判断这个变量是否包含完整数据并做相应处理。 接收就是在SerialPort类的rececivedata里面接收 设置每接受到1个字节时,触发oncomm事件。 以前搞
BCB
的时候...
BCB
串口调试经验(转载)
项目(先这么称呼吧)简介,简单的来说就是计算机通过串口分别控制4个二极管的亮度。
上位机部分:只说说我用到的一些函数,和遇到的问题。基本的比如什么是异步通讯啦之类的就不说了,随便网上一搜能找一箩筐!
下边是一些函数:
函数名 作用
1.CreateFile 打开串口
2.GetCommState 检测串口设置
3.SetCommState 设置串口
网络及通讯开发
1,317
社区成员
8,874
社区内容
发帖
与我相关
我的任务
网络及通讯开发
C++ Builder 网络及通讯开发
复制链接
扫一扫
分享
社区描述
C++ Builder 网络及通讯开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章