SerialPort 类的运行过程问题?

在SerialPort::startMonitor的时候启动了CommThread线程;而CSerialPort::CommThread这个线程函数又是个死循环,同时在C... 在SerialPort::startMonitor的时候启动了CommThread线程;
而CSerialPort::CommThread 这个线程函数又是个死循环,同时在CommThread函数里面调用了的ReceiveChar函数,同时ReceiveChar里面又是个for(;;)死循环;从表面上看,好像是应该永远停留哎ReceiveChar的死循环里面不能跳出来,但是在调试的时候发现,程序会跳出ReceiveChar函数,又重新执行回CommThread函数;我现在就不明白这个类的运行机制了; 还是说我理解有错误,因为在CommThread 函数里面这个等待事件中断的函数,代码如:Event = WaitForMultipleObjects(3, port->m_hEventArray, FALSE, INFINITE);;只要事件产生中断就跳出ReceiveChar的死循环,重新进入ReceiveChar函数呢?
展开
 我来答
clxye
推荐于2016-11-12 · 超过28用户采纳过TA的回答
知道答主
回答量:91
采纳率:0%
帮助的人:83.1万
展开全部
你这个问题提的很尖锐啊!这个类我四年前用过,而且涉及串口操作我一般还是会优先用它。

void CSerialPort::ReceiveChar(CSerialPort* port, COMSTAT comstat)
{
BOOL bRead = TRUE;
BOOL bResult = TRUE;
DWORD dwError = 0;
DWORD BytesRead = 0;
unsigned char RXBuff;

for (;;)
{
EnterCriticalSection(&port->m_csCommunicationSync);
bResult = ClearCommError(port->m_hComm, &dwError, &comstat);
LeaveCriticalSection(&port->m_csCommunicationSync);

if (comstat.cbInQue == 0)
{
// break out when all bytes have been read
// 没有数据需要读取时,跳出。你需要的答案就在这里。
break;
}

为了解答你这个问题,我特地从网上重新找了这个类(好久没用了,身边没有),也分析了一下代码,所以记得给分啊。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
网上冲浪玩家
2011-09-06 · TA获得超过574个赞
知道小有建树答主
回答量:535
采纳率:100%
帮助的人:343万
展开全部
应该是当ReceiveChar为空的时候,只要serialport只要打开端口,commthred就会一直执行下去,这个线程会一直监控ReceiveChar直到ReceiveChar有值.而当ReceiveChar被处理过后,线程会把ReceiveChar清空,然后继续监控,直到下次ReceiveChar有值.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
夜来雨早来晴
推荐于2016-07-01 · TA获得超过3.1万个赞
知道大有可为答主
回答量:9110
采纳率:60%
帮助的人:820万
展开全部
serial port,即串行端口,现在大多数硬件设备均采用串口技术与计算机相连,因此串口的应用程序开发越来越普遍。例如,在计算机没有安装网卡的情况下,将本机上的一些信息数据 传输到另一台计算机上,那么利用串口通信就可以实现。运行本程序,在“发送数据”文本框中输入要传送的数据,单击【发送】按钮,将传送的数据发送到所选择 的端口号中;单击【接收】按钮,传递的数据被接收到“接收数据”文本框中。
  实现过程:
  (1)新建一个项目,命名为Ex13_01,默认窗体为Form1。
  (2)在Form1窗体中,主要添加两个Button控件,分别用于执行发送数据和接受数据,添加两个TextBox控件,用于输入发送数据和显示接收数据。
  (3)主要程序代码。
  private void button1_Click(object sender, EventArgs e)
  {
  serialPort1.PortName = "COM1";
  serialPort1.BaudRate = 9600;
  serialPort1.Open();
  byte[] data = Encoding.Unicode.GetBytes(textBox1.Text);
  string str = Convert.ToBase64String(data);
  serialPort1.WriteLine(str);
  MessageBox.Show("数据发送成功!","系统提示");
  }
  private void button2_Click(object sender, EventArgs e)
  {
  byte[] data = Convert.FromBase64String(serialPort1.ReadLine());
  textBox2.Text = Encoding.Unicode.GetString(data);
  serialPort1.Close();
  MessageBox.Show("数据接收成功!","系统提示");
  }
  相关技术:

  现在微软推出了最新版本的 Visual Studio 2008 开发工具,可以不再采 用第三方控件的方法来设计串口通讯程序。NET Framework 2.0 类库包含了 SerialPort 类,方便地实现了所需要串口通讯的多种功能, 可以实现MSComm 编程方法快速转换到以 SerialPort 类为核心的串口通讯。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式