当前位置: 技术问答>linux和unix
是高手就进来帮帮忙!ARM9(2440)多线程串口编程,运行错误:__gnu_cxx::__concurrence_broadcast_error
来源: 互联网 发布时间:2017-02-11
本文导语: 在ARM9运行多线程串口程序是抛出这样的异常:terminate called after throwing an instance of '__gnu_cxx::__concurrence_broadcast_error' what(): __gnu_cxx::__concurrence_broadcast_error 只要以调用OpenPort就报错。 该源代码在Fedora9上编译...
在ARM9运行多线程串口程序是抛出这样的异常:terminate called after throwing an instance of '__gnu_cxx::__concurrence_broadcast_error'
what(): __gnu_cxx::__concurrence_broadcast_error
只要以调用OpenPort就报错。
该源代码在Fedora9上编译、运行都没问题,程序中用了网上找到的一个多线程串口类。
编译器用的是gcc 4.4.3
Google、百度边了也没找到解决方法,各位有什么解决方法或思路不?
希望大家能帮帮忙,多谢!!!!!!!!
what(): __gnu_cxx::__concurrence_broadcast_error
只要以调用OpenPort就报错。
该源代码在Fedora9上编译、运行都没问题,程序中用了网上找到的一个多线程串口类。
编译器用的是gcc 4.4.3
Google、百度边了也没找到解决方法,各位有什么解决方法或思路不?
希望大家能帮帮忙,多谢!!!!!!!!
//主程序
#include "CSerial.h"
#include
using namespace std;
int main(int argc, char* argv[])
{
CSerial::CSerial serial;
serial.OpenPort("/dev/ttySAC0", 115200, 8, 1, 'N');//报错!!
while(1);
return 0;
}
/*自定义串口类
* CSerial.h
*
* Created on: 2010-7-20
* Author: yzm
*/
#ifndef CSERIAL_H_
#define CSERIAL_H_
#include
#include
#include
#include
#include
#include /*文件控制定义*/
#include /*PPSIX 终端控制定义*/
#include /*错误号定义*/
#include
#include
#include "CCriticalSection.h"
using namespace std;
#define BUFFER_LENGTH 1024
namespace CSerial {
class CSerial
{
private:
string m_PortName;
int m_baudrate;
int m_databits;
int m_stopbits;
char m_parity;
//通讯线程标识符ID
pthread_t m_thread;
CCriticalSection mutex;
// 串口数据接收线程
static void* ReceiveThreadFunc( void* lparam );
public:
CSerial();
virtual ~CSerial();
// 已打开的串口文件描述符
int m_fd;
int m_DatLen;
unsigned char DatBuf[BUFFER_LENGTH];
int m_ExitThreadFlag;
// 按照指定的串口参数打开串口,并创建串口接收线程
int OpenPort( string PortName, int baudrate, int databits, int stopbits, char parity );
// 关闭串口并释放相关资源
int ClosePort( );
// 向串口写数据
int WritePort( unsigned char* Buf, int len );
// 接收串口数据处理函数
virtual int PackagePro( unsigned char* Buf, int len );
private:
void set_speed(int fd, int speed);
int set_Parity(int fd,int databits,int stopbits,int parity);
};
}
#endif /* CSERIAL_H_ */
/*
* CSerial.cpp
*
* Created on: 2010-7-20
* Author: yzm
*/
#include "CSerial.h"
#include
#include
#include
#include /*Unix 标准函数定义*/
namespace CSerial {
int speed_arr[] = {B115200,B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400,
B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {115200,38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200,
9600, 4800, 2400, 1200, 300, };
string BYTE2HEX(unsigned char* buffer,int nSize)
{
char buf[1024];
memset(buf,0,1024);
int len = 0;
for(int i = 0;i m_ExitThreadFlag) {
break;
}
FD_ZERO(&fdRead);
FD_SET(pSer->m_fd,&fdRead);
aTime.tv_sec = 2;
aTime.tv_usec = 100;
ret = select(pSer->m_fd + 1, &fdRead, NULL, NULL, &aTime);
if (ret ClosePort();
break;
}
if (ret > 0) {
//判断是否读事件
if (FD_ISSET(pSer->m_fd,&fdRead)) {
//data available, so get it!
pSer->m_DatLen = read(pSer->m_fd, pSer->DatBuf, BUFFER_LENGTH);
// 对接收的数据进行处理,这里为简单的数据回发
if (pSer->m_DatLen > 0) {
pSer->PackagePro(pSer->DatBuf, pSer->m_DatLen);
}
// 处理完毕
}
}
}
printf("ReceiveThreadFunc finishedn");
pthread_exit(NULL);
return 0;
}
/**
*@brief 设置串口通信速率
*@param fd 类型 int 打开串口的文件句柄
*@param speed 类型 int 串口速度
*@return void
*/
void CSerial::set_speed(int fd, int speed) {
unsigned int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for (i = 0; i 0){
hasWrite = write(m_fd, Buf + wPos, ToWrite);
if(hasWrite