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函数呢? 展开
而CSerialPort::CommThread 这个线程函数又是个死循环,同时在CommThread函数里面调用了的ReceiveChar函数,同时ReceiveChar里面又是个for(;;)死循环;从表面上看,好像是应该永远停留哎ReceiveChar的死循环里面不能跳出来,但是在调试的时候发现,程序会跳出ReceiveChar函数,又重新执行回CommThread函数;我现在就不明白这个类的运行机制了; 还是说我理解有错误,因为在CommThread 函数里面这个等待事件中断的函数,代码如:Event = WaitForMultipleObjects(3, port->m_hEventArray, FALSE, INFINITE);;只要事件产生中断就跳出ReceiveChar的死循环,重新进入ReceiveChar函数呢? 展开
3个回答
展开全部
你这个问题提的很尖锐啊!这个类我四年前用过,而且涉及串口操作我一般还是会优先用它。
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;
}
为了解答你这个问题,我特地从网上重新找了这个类(好久没用了,身边没有),也分析了一下代码,所以记得给分啊。
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;
}
为了解答你这个问题,我特地从网上重新找了这个类(好久没用了,身边没有),也分析了一下代码,所以记得给分啊。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
应该是当ReceiveChar为空的时候,只要serialport只要打开端口,commthred就会一直执行下去,这个线程会一直监控ReceiveChar直到ReceiveChar有值.而当ReceiveChar被处理过后,线程会把ReceiveChar清空,然后继续监控,直到下次ReceiveChar有值.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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)新建一个项目,命名为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 类为核心的串口通讯。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询