急!请各位大侠帮忙啊,串口通讯问题

shangzh 2007-03-19 02:46:01
大家好!
我想通过VC实现一个串口转发的功能,就是说如果串口1有数据过来就转发到串口2上去,串口2有数据过来就发送到串口1上去,我是通过win api 来做的,开了2个线程用于监视串口1和串口2的事件,用WaitCommEvent来等待事件发生,我没有用overlapped 格式,(用了也不好用),我的问题是当有数据到达串口,然后往另一个串口写时,无法完成写操作,程序停在writefile函数那里不动了,具体代码如下:
//这段是开启2个线程的代码
void CSmsTestApp::OnActive()
{
// TODO: Add extra initialization here

CSmsTestApp* app = (CSmsTestApp*)AfxGetApp();
char* ans = app->ans;

if(flag != 3)
{
AfxMessageBox("请先设置端口!");
return;
}

//启动串口1处理线程
DWORD nThreadId1;
hCommThread1 = ::CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0,
(LPTHREAD_START_ROUTINE)Com1ThreadProcess, AfxGetMainWnd()->m_hWnd, 0, &nThreadId1);
if (hCommThread1 == NULL)
{
AfxMessageBox("创建串口1处理线程失败");
return;
}

//启动串口2处理线程
DWORD nThreadId2;
hCommThread2 = ::CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0,
(LPTHREAD_START_ROUTINE)Com2ThreadProcess, AfxGetMainWnd()->m_hWnd, 0, &nThreadId2);
if (hCommThread2 == NULL)
{
AfxMessageBox("创建串口2处理线程失败");
return;
}
}

//这段是2个线程的代码
DWORD WINAPI Com1ThreadProcess(HWND hWnd)//主窗口句柄
{
DWORD wEven;
char ans[128]; // 应答串

memset(ans, 0 ,128);
SetCommMask(hComm1, EV_RXCHAR | EV_TXEMPTY);
while (TRUE)
{
WaitCommEvent(hComm1, &wEven, NULL);
if(wEven == 0)
{
NULL;
}
else
{
if (wEven & EV_RXCHAR == EV_RXCHAR)
{
ReadComm(ans, 128, hComm1);
if(strlen(ans) > 0)
{
//WriteComm(ans, strlen(ans), hComm2);
::PostMessage(hWnd, COM_RECVDATA, (unsigned int) 2, 0);
}

break;
}
}
}
return TRUE;
}

DWORD WINAPI Com2ThreadProcess(HWND hWnd)//主窗口句柄
{
DWORD wEven;
CSmsTestApp* app = (CSmsTestApp*)AfxGetApp();
char* ans = app->ans;

memset(ans, 0 ,128);
SetCommMask(hComm2, EV_RXCHAR | EV_TXEMPTY);
while (TRUE)
{
WaitCommEvent(hComm2, &wEven, NULL);
if (wEven == 0)
{
NULL;
}
else
{
if (wEven & EV_RXCHAR == EV_RXCHAR)
{
ReadComm(ans, 128, hComm2);
if(strlen(ans) > 0)
{
//WriteComm(ans, strlen(ans), hComm1);
::PostMessage(hWnd, COM_RECVDATA, (unsigned int) 1, 0);
}

break;
}
}
}
return TRUE;
}


//下面是读写串口的接口函数
BOOL OpenComm(const char* pPort, int nBaudRate, int nParity, int nByteSize, int nStopBits, HANDLE *handle)
{
DCB dcb; // 串口控制块
COMMTIMEOUTS timeouts = { // 串口超时控制参数
100, // 读字符间隔超时时间: 100 ms
1, // 读操作时每字符的时间: 1 ms (n个字符总共为n ms)
500, // 基本的(额外的)读超时时间: 500 ms
1, // 写操作时每字符的时间: 1 ms (n个字符总共为n ms)
100}; // 基本的(额外的)写超时时间: 100 ms

*handle = CreateFile(pPort, // 串口名称或设备路径
GENERIC_READ | GENERIC_WRITE, // 读写方式
0, // 共享方式:独占
NULL, // 默认的安全描述符
OPEN_EXISTING, // 创建方式
0, // 不需设置文件属性
NULL); // 不需参照模板文件

if(*handle == INVALID_HANDLE_VALUE) return FALSE; // 打开串口失败

GetCommState(*handle, &dcb); // 取DCB

dcb.BaudRate = nBaudRate;
dcb.ByteSize = nByteSize;
dcb.Parity = nParity;
dcb.StopBits = nStopBits;

SetCommState(*handle, &dcb); // 设置DCB

SetupComm(*handle, 4096, 1024); // 设置输入输出缓冲区大小

SetCommTimeouts(*handle, &timeouts); // 设置超时

return TRUE;
}

// 关闭串口
BOOL CloseComm(HANDLE hComm)
{
return CloseHandle(hComm);
}

// 写串口
// 输入: pData - 待写的数据缓冲区指针
// nLength - 待写的数据长度
// 返回: 实际写入的数据长度
int WriteComm(void* pData, int nLength, HANDLE hComm)
{
DWORD dwNumWrite; // 串口发出的数据长度

WriteFile(hComm, pData, (DWORD)nLength, &dwNumWrite, NULL);

return (int)dwNumWrite;
}

// 读串口
// 输入: pData - 待读的数据缓冲区指针
// nLength - 待读的最大数据长度
// 返回: 实际读出的数据长度
int ReadComm(void* pData, int nLength, HANDLE hComm)
{
DWORD dwNumRead; // 串口收到的数据长度

ReadFile(hComm, pData, (DWORD)nLength, &dwNumRead, NULL);

return (int)dwNumRead;
}


//下面是子线程往主线程发送COM_RECVDATA消息后的处理函数
LRESULT CMainFrame::OnRcvData(WPARAM wPara, LPARAM lPara)
{
CSmsTestApp* app = (CSmsTestApp*)AfxGetApp();
char* ans = app->ans;
if(wPara == 1)
WriteComm(ans, strlen(ans), hComm1);
else if(wPara == 2)
WriteComm(ans, strlen(ans), hComm2);

return 0;
}

以上就是我的大部分程序,各位大侠,请问我要做串口转发究竟该怎么做?
我的程序有什么问题啊,是不是同一线程只能处理一种操作?(读或写)
谢谢大家了
...全文
245 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

2,425

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 其他硬件开发
社区管理员
  • 其他硬件开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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