我想问下多线程和串口通信mscomm控件的问题

时间:2022-09-02 19:56:40
我现在是这么个情况,1、先用mscomm控件编写了串口通信,然后发数据,我想用多线程的方式来一组一组的发数据,部分程序如下:但是一运行就中断,不知道怎么弄,
2、还有一个问题就是我不知道我要用到多少子线程,不过在程序运行的时候就知道有多少组数据了,一组数据对应一个线程,我该怎么写?
其中一个子线程例子如下:
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
WaitForSingleObject(hMutex,INFINITE);
while(TRUE)
{
char ch[100];
CTestDlg *pDlg=(CTestDlg*)lpParameter;
CByteArray Array;
const int count=3;
BYTE buf[count];
Array.RemoveAll();
Array.SetSize(count);
if(BST_UNCHECKED==pDlg->IsDlgButtonChecked(IDC_CHECK))
{
Sleep(waittime*1000);
while (pos11==pos1)
{
Sleep(100);
buf[0]=0xFF;
buf[1]=0x23;
buf[2]=0x11;
for(int i=0;i<count;i++)
Array.SetAt(i,buf[i]);
pDlg->m_mscomm.put_OutBufferCount(0);
pDlg->m_mscomm.put_Output(COleVariant(Array));//这里就一运行就一直中断

}
}

break;
}

ReleaseMutex(hMutex);
return 0;
}

11 个解决方案

#1


希望大家多多帮忙。。。。

#2


1.你线程犯了一个错误,mscomm控件属性界面相关的东西,而你在线程中直接操作界面,这是不安全的,改成在线程中发消息到主界面,由主界面操作mscomm控件。
2.串口通讯据我所知,应该设备是独占式的,不能两个线程同时打开同一个串口吧?如果由主程序打开串口,子线程通过串口句柄同时操作应该没问题。

#3


支持楼上。。

#4


串口是独占设备,不用同时读写!
使用 多线程没什么用

#5


多线程操作串口?
你同时操作几个串口
如果是一个那也不可能并行啊
串口有不是并口
既然不能并行那线程一个就够了啊

#6


引用 2 楼 jason_wentzel 的回复:
1.你线程犯了一个错误,mscomm控件属性界面相关的东西,而你在线程中直接操作界面,这是不安全的,改成在线程中发消息到主界面,由主界面操作mscomm控件。
2.串口通讯据我所知,应该设备是独占式的,不能两个线程同时打开同一个串口吧?如果由主程序打开串口,子线程通过串口句柄同时操作应该没问题。


项目是要求是这样的,要一段一段的调试一个机械臂,先运动一段满足要求停下,然后接着运行下一段。在程序中我加了一个while 循环,要是不用多线程(互斥),会卡死,所以我想一个线程一个线程的运行。

#7


引用 5 楼 xianglitian 的回复:
多线程操作串口?
你同时操作几个串口
如果是一个那也不可能并行啊
串口有不是并口
既然不能并行那线程一个就够了啊

项目是要求是这样的,要一段一段的调试一个机械臂,先运动一段满足要求停下,然后接着运行下一段。在程序中我加了一个while 循环,要是不用多线程(互斥),会卡死,所以我想一个线程一个线程的运行。

#8


引用 7 楼 flyjincun 的回复:
Quote: 引用 5 楼 xianglitian 的回复:

多线程操作串口?
你同时操作几个串口
如果是一个那也不可能并行啊
串口有不是并口
既然不能并行那线程一个就够了啊

项目是要求是这样的,要一段一段的调试一个机械臂,先运动一段满足要求停下,然后接着运行下一段。在程序中我加了一个while 循环,要是不用多线程(互斥),会卡死,所以我想一个线程一个线程的运行。
一段一段和一个线程一个线程没关系吧
多线程是为了解决并发
也就是如果你要同时进行应该考虑多线程
你说不用多线程会卡死
我觉得卡死和多线程没关系
而且你现在用多线程不也是卡死么
所以还是你程序结构不合理

#9


谢谢大家,我新手一个,要学习的地方还很多

#10


引用 8 楼 xianglitian 的回复:
Quote: 引用 7 楼 flyjincun 的回复:

Quote: 引用 5 楼 xianglitian 的回复:

多线程操作串口?
你同时操作几个串口
如果是一个那也不可能并行啊
串口有不是并口
既然不能并行那线程一个就够了啊

项目是要求是这样的,要一段一段的调试一个机械臂,先运动一段满足要求停下,然后接着运行下一段。在程序中我加了一个while 循环,要是不用多线程(互斥),会卡死,所以我想一个线程一个线程的运行。
一段一段和一个线程一个线程没关系吧
多线程是为了解决并发
也就是如果你要同时进行应该考虑多线程
你说不用多线程会卡死
我觉得卡死和多线程没关系
而且你现在用多线程不也是卡死么
所以还是你程序结构不合理

在问一个问题,子对话框怎么实现用串口发送数据?

#11


串口发送数据和是不是子对话框没关系吧
直接api操作的话就是拿到句柄WriteFile啊
在程序的任何位置都一样

#1


希望大家多多帮忙。。。。

#2


1.你线程犯了一个错误,mscomm控件属性界面相关的东西,而你在线程中直接操作界面,这是不安全的,改成在线程中发消息到主界面,由主界面操作mscomm控件。
2.串口通讯据我所知,应该设备是独占式的,不能两个线程同时打开同一个串口吧?如果由主程序打开串口,子线程通过串口句柄同时操作应该没问题。

#3


支持楼上。。

#4


串口是独占设备,不用同时读写!
使用 多线程没什么用

#5


多线程操作串口?
你同时操作几个串口
如果是一个那也不可能并行啊
串口有不是并口
既然不能并行那线程一个就够了啊

#6


引用 2 楼 jason_wentzel 的回复:
1.你线程犯了一个错误,mscomm控件属性界面相关的东西,而你在线程中直接操作界面,这是不安全的,改成在线程中发消息到主界面,由主界面操作mscomm控件。
2.串口通讯据我所知,应该设备是独占式的,不能两个线程同时打开同一个串口吧?如果由主程序打开串口,子线程通过串口句柄同时操作应该没问题。


项目是要求是这样的,要一段一段的调试一个机械臂,先运动一段满足要求停下,然后接着运行下一段。在程序中我加了一个while 循环,要是不用多线程(互斥),会卡死,所以我想一个线程一个线程的运行。

#7


引用 5 楼 xianglitian 的回复:
多线程操作串口?
你同时操作几个串口
如果是一个那也不可能并行啊
串口有不是并口
既然不能并行那线程一个就够了啊

项目是要求是这样的,要一段一段的调试一个机械臂,先运动一段满足要求停下,然后接着运行下一段。在程序中我加了一个while 循环,要是不用多线程(互斥),会卡死,所以我想一个线程一个线程的运行。

#8


引用 7 楼 flyjincun 的回复:
Quote: 引用 5 楼 xianglitian 的回复:

多线程操作串口?
你同时操作几个串口
如果是一个那也不可能并行啊
串口有不是并口
既然不能并行那线程一个就够了啊

项目是要求是这样的,要一段一段的调试一个机械臂,先运动一段满足要求停下,然后接着运行下一段。在程序中我加了一个while 循环,要是不用多线程(互斥),会卡死,所以我想一个线程一个线程的运行。
一段一段和一个线程一个线程没关系吧
多线程是为了解决并发
也就是如果你要同时进行应该考虑多线程
你说不用多线程会卡死
我觉得卡死和多线程没关系
而且你现在用多线程不也是卡死么
所以还是你程序结构不合理

#9


谢谢大家,我新手一个,要学习的地方还很多

#10


引用 8 楼 xianglitian 的回复:
Quote: 引用 7 楼 flyjincun 的回复:

Quote: 引用 5 楼 xianglitian 的回复:

多线程操作串口?
你同时操作几个串口
如果是一个那也不可能并行啊
串口有不是并口
既然不能并行那线程一个就够了啊

项目是要求是这样的,要一段一段的调试一个机械臂,先运动一段满足要求停下,然后接着运行下一段。在程序中我加了一个while 循环,要是不用多线程(互斥),会卡死,所以我想一个线程一个线程的运行。
一段一段和一个线程一个线程没关系吧
多线程是为了解决并发
也就是如果你要同时进行应该考虑多线程
你说不用多线程会卡死
我觉得卡死和多线程没关系
而且你现在用多线程不也是卡死么
所以还是你程序结构不合理

在问一个问题,子对话框怎么实现用串口发送数据?

#11


串口发送数据和是不是子对话框没关系吧
直接api操作的话就是拿到句柄WriteFile啊
在程序的任何位置都一样