串口通讯问题

sxqinge 2013-10-24 03:33:00
我写的串口通讯程序与一般的迷你USB串口,虚拟串口以及串口卡的串口通讯都没有问题,今天用标准USB串口进行通讯时发现数据包发送了一遍(通过监控工具发现数据发送完全),但是没有任何数据返回,同时接着发送第二遍时通过监控工具就看不到有数据发送了,应该是串口死掉,重启串口再次发送,又与上面情况一致。
请问这是什么原因呢?麻烦大家给分析提供个解决思路,谢谢了
...全文
269 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zcnc2012 2013-11-30
  • 打赏
  • 举报
回复
我估计可能是USB转串口的问题,性能不太稳定
baoyz 2013-11-29
  • 打赏
  • 举报
回复
引用 9 楼 jichao1010 的回复:
你是和谁通信的,谁返回你?会不会是通信的另一方有问题,或者就是你发送的数据类型有问题。应该先检查下第一次没成功的问题。 应该不是串口线程的问题
赞成。 有可能不是你的程序死掉了。而是在漫长的等待中。INFINITE这个可是不小的一个数,而且你没有超时响应。
sxqinge 2013-11-27
  • 打赏
  • 举报
回复
最近忙于其他项目,忘记这件事情了,惜乎还是没有解决,求帮助
sxqinge 2013-10-29
  • 打赏
  • 举报
回复
引用 8 楼 Wang471981125 的回复:
把串口接收和发送端短接在一起测试
以前的通讯工装都是通过九针的串口接头来连接,这样可以通过短接的方式进行自发自收的测试。我们现在的工装就是直接用普通的USB接口连接电脑,方形的标准usb接口连接通讯工装,无需电源,通过MBUS通讯方式直接与被检设备连接。
引用 9 楼 jichao1010 的回复:
你是和谁通信的,谁返回你?会不会是通信的另一方有问题,或者就是你发送的数据类型有问题。应该先检查下第一次没成功的问题。 应该不是串口线程的问题
我用低版本的串口助手也出现与我同样的问题,高版本的就没事了,估计还是串口线程的问题,可是一直找不到问题点所在
苏克贝塔03 2013-10-28
  • 打赏
  • 举报
回复
你是和谁通信的,谁返回你?会不会是通信的另一方有问题,或者就是你发送的数据类型有问题。应该先检查下第一次没成功的问题。 应该不是串口线程的问题
sxqinge 2013-10-25
  • 打赏
  • 举报
回复
顶顶更健康~~
sxqinge 2013-10-25
  • 打赏
  • 举报
回复
谢谢亲们的热心回复,我这个串口线程在平时工作都好好的,即使没有捕获到串口数据线程也会退出。楼上说我的while循环需要更改为while(Port->m_ThreadAlive),但是问题是,串口一直都是打开的,线程我也加了个判断,更改如下:

unsigned long WINAPI TSerialPort::CommThread(LPVOID Param)
{
	TSerialPort *Port = (TSerialPort *)Param;
	if (NULL == Port)
	{
        ExitThread(0);
	}

	if (INVALID_HANDLE_VALUE == Port->m_Comm)
	{
		ExitThread(0);
	}

	Port->m_ThreadAlive = true;

	unsigned long Event = 0;
	unsigned long CommEvent = 0;
	unsigned long Error = 0;
	COMSTAT Comstate;
	bool Result = true;	

    if( Port->m_Comm )
	PurgeComm(Port->m_Comm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
	while(1)
	{
		Result = WaitCommEvent(Port->m_Comm, &Event, &Port->m_Overlapped);
		if (Result)
		{
			Result = ClearCommError(Port->m_Comm, &Error, &Comstate);
			if (Comstate.cbInQue == 0)
			{
				continue;
			}
		}
		else
		{
			 switch (Error = GetLastError())
            {   
            case ERROR_IO_PENDING:    
                {   
                    // This is a normal return value if there are no bytes  
                    // to read at the port.  
                    // Do nothing and continue  
                    break;  
                }  
            case 87:  
                {  
                    // Under Windows NT, this value is returned for some reason.  
					// I have not investigated why, but it is also a valid reply
                    // Also do nothing and continue.  
                    break;  
                }
            default:  
				{
                    // All other error codes indicate a serious error has  
                    // occured.  Process this error.  
                    Port->ProcessErrorMessage("WaitCommEvent()");  
                    break;  
				}
			}
		}

		Event = WaitForMultipleObjects(3, Port->m_EventArray, false, INFINITE);
		switch(Event)
		{
		case 0:
        	Port->m_ThreadAlive = false;
        	ExitThread(0);
			break;
		case 1:
			GetCommMask(Port->m_Comm, &CommEvent);//-------1
			if (CommEvent & EV_RXCHAR)  //如果屏蔽这句,用标准串口能接收到数据,但
			{                           //即使接收到了,依旧在“1”中死循环。
				ReceiveChar(Port, Comstate);
			}
			break;
		case 2:
			SendChar(Port);
			break;
		}
	}
	return 0;
}
Wang471981125 2013-10-25
  • 打赏
  • 举报
回复
把串口接收和发送端短接在一起测试
sxqinge 2013-10-25
  • 打赏
  • 举报
回复
顶顶更健康,期待热心专家
昨夜无风 2013-10-24
  • 打赏
  • 举报
回复
while循环怎么退出来呢? 是不是应该写成 while(Port->m_ThreadAlive)
sxqinge 2013-10-24
  • 打赏
  • 举报
回复
如果我是用其他方式操作串口的话,即使没有读到数据,也不会使串口线程死锁;很奇怪为什么会出现这样的问题。
sxqinge 2013-10-24
  • 打赏
  • 举报
回复
没有报错,调试时发现在监听串口时,发现串口线程进入了死锁状态,就是一直在死等返回消息。代码如下:

unsigned long WINAPI TSerialPort::CommThread(LPVOID Param)
{
	TSerialPort *Port = (TSerialPort *)Param;
	if (NULL == Port)
	{
        ExitThread(0);
	}

	if (INVALID_HANDLE_VALUE == Port->m_Comm)
	{
		ExitThread(0);
	}

	Port->m_ThreadAlive = true;

	unsigned long Event = 0;
	unsigned long CommEvent = 0;
	unsigned long Error = 0;
	COMSTAT Comstate;
	bool Result = true;	

	PurgeComm(Port->m_Comm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
	while(1)
	{
		Result = WaitCommEvent(Port->m_Comm, &Event, &Port->m_Overlapped);
		if (Result)
		{
			Result = ClearCommError(Port->m_Comm, &Error, &Comstate);
			if (Comstate.cbInQue == 0)
			{
				continue;
			}
		}
		else
		{
			 Error = GetLastError();
        }

		Event = WaitForMultipleObjects(3, Port->m_EventArray, false, INFINITE);
		switch(Event)
		{
		case 0:
        	Port->m_ThreadAlive = false;
        	ExitThread(0);
			break;
		case 1:
			GetCommMask(Port->m_Comm, &CommEvent);
			if (CommEvent & EV_RXCHAR)
			{
				ReceiveChar(Port, Comstate);
			}
			break;
		case 2:
			SendChar(Port);
			break;
		}
	}
	return 0;
}
drlsdrls 2013-10-24
  • 打赏
  • 举报
回复
帮顶,程序执行没报错吗?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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