/*
* CCom.cpp
*
* Created on: 2012-12-17
* Author: 192nk
*/
#include<string.h>
#include<stdio.h>
#include <errno.h>
#include <fcntl.h>//open
#include <termios.h>//speed
#include <unistd.h>
#include<termio.h>
#include "CCom.h"
#include "CComThread.h"
CCom::CCom() {
// TODO Auto-generated constructor stub
fd =0;
m_nLen=0;//
m_nOffset=0;//
m_nIsSend=0;
m_nMessage =0;
m_nIsSend=0;
m_nIsRecvd=0;
bzero(m_gSendPath, sizeof(m_gSendPath));
bzero(m_gRecvPath, sizeof(m_gRecvPath));
}
CCom::~CCom() {
// TODO Auto-generated destructor stub
}
int CCom::Open_port(int nCom_port)
{
char *dev[] = {"/dev/ttyS0", "/dev/ttyS1", "/dev/ttyS2","/dev/ttyS3",
"/dev/ttyS4", "/dev/ttyS5", "/dev/ttyS6"};
if((nCom_port < 0) || (nCom_port > 6) )
{
printf("the port is out range");
return -1;
}
fd = open(dev[nCom_port], O_RDWR | O_NOCTTY | O_NDELAY);
if(fd < 0)
{
perror("open serial port");
return -1;
}
if(fcntl(fd, F_SETFL,0) < 0)
{
perror("fcntl F_SETFL");
return -1;
}
if(isatty(fd) == 0)
{
perror("isatty is not a terminal device");
return -1;
}
return fd;
}
int CCom::Set_port( int nBaud_rate, int nData_bits, char cParity, int nStop_bits)
{
struct termios newtio,oldtio;
if( tcgetattr(fd,&oldtio) != 0)
{
perror("Setup Serial 1");
return -1;
};
bzero(&newtio,sizeof(newtio));
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE;
/* set baud_speed*/
switch(nBaud_rate)
{
case 2400:
cfsetispeed(&newtio,B2400);
cfsetospeed(&newtio,B2400);
break;
case 4800:
cfsetispeed(&newtio,B4800);
cfsetospeed(&newtio,B4800);
break;
case 9600:
cfsetispeed(&newtio,B9600);
cfsetospeed(&newtio,B9600);
break;
case 19200:
cfsetispeed(&newtio,B19200);
cfsetospeed(&newtio,B19200);
break;
case 38400:
cfsetispeed(&newtio,B38400);
cfsetospeed(&newtio,B38400);
break;
default:
case 115200:
cfsetispeed(&newtio,B115200);
cfsetospeed(&newtio,B115200);
break;
}
/* set data_bits upon 7 or 8*/
switch(nData_bits)
{
case 7:
newtio.c_cflag |= CS7;
break;
default :
case 8:
newtio.c_cflag |= CS8;
break;
}
/**/
switch(cParity)
{
default:
case 'N':
case 'n':
{
newtio.c_cflag &= ~PARENB;
newtio.c_iflag &= ~INPCK;
}
break;
case 'o':
case 'O':
{
newtio.c_cflag |= (PARODD | PARENB);
newtio.c_iflag |= INPCK;
}
break;
case 'e':
case 'E':
{
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
newtio.c_iflag |= INPCK;
}
break;
case 's':
case 'S':
{
newtio.c_cflag &= ~PARENB;
newtio.c_cflag &= ~CSTOPB;
}
break;
}
/*set stop_bits 1 or 2 */
switch(nStop_bits)
{
default:
case 1:
{
newtio.c_cflag &= ~CSTOPB;
}
break;
case 2:
{
newtio.c_cflag |= CSTOPB;
}
break;
}
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 1;
tcflush(fd,TCIFLUSH);
if((tcsetattr(fd,TCSANOW,&newtio)) != 0)
{
perror("com set error");
return -1;
}
printf("set UART done!\n");
return 0;
}
void CCom::SetSendInfo(char *pPath)
{
strcpy(m_gSendPath, pPath);
}
void CCom::SetRevInfo(char *pPath)
{
strcpy(m_gRecvPath,pPath);
}
void CCom::RunCom(void *param)
{
if(MyComThread.RunThread(ComThread,this)!=0)//
// if(MyComThread.RunThread(ComThread,param)!=0)//
fprintf(stderr,"ComThread create Error:%s\n",strerror(errno));
}
void CCom::JoinCom()
{
if(MyComThread.JoinThread()!=0)
fprintf(stderr,"ComThread Join Error:%s\n",strerror(errno));
}
void *CCom::ComThread(void *arg)
{
CCom *tmpcom;
tmpcom = (CCom*)arg;
tmpcom->ComReadThread(NULL);
// com.ComReadThread(arg);//不能用this—>,静态成员函数是属于整个类的,没有特指定某个对象,静态成员函数只能通过对象名来访问非静态成员函数
return NULL;
}
void CCom::ComReadThread(void *arg)
{
int nResv;
char gBuff[MAXBUF];
printf("ComReadThread Begin\n");
MessageBegin();
while(1)
{
sleep(1);
nResv=MyComFile.ReadFile(fd,gBuff,MAXBUF);
MessageChange(gBuff);
};
}
int CCom::MessageBegin()
{
char gTembuffer[256];
strcpy(gTembuffer,"begin");
remove(m_gRecvPath);
m_nMessage = MESSAGE_SEND;//通知发送端开始发送
MyComFile.WriteFile(fd,gTembuffer,MAXBUF);
return 1;
}
void CCom::MessageChange(char *pBuffer)
{
printf("串口接收的m_Len:%d\n",m_nLen);
switch (m_nMessage)
{
case MESSAGE_SEND:
{
MessageSend(pBuffer);
break;
}
case MESSAGE_RESV:
{
MessageResv(pBuffer);
break;
}
}
}
int CCom::MessageSend(char *pBuffer)
{
int nLen,nOffset;
printf("已经接收了%d\n", m_nOffset);
nOffset =m_nOffset;
nLen = MyComFile.ReadFileBuf(m_gSendPath, pBuffer, MAXBUF,nOffset);
if (nLen == 0)
{
printf("发送完毕!\n");
MessageEnd();
return 0;
}
m_nMessage= MESSAGE_RESV;//通知接收端接收
m_nLen = nLen;
m_nOffset = m_nIsSend;
m_nIsSend = m_nIsSend + nLen;
MyComFile.WriteFile(fd,pBuffer, MAXBUF);//发送的时候要将数据写入fd所指的文件,
return 1;
}
int CCom::MessageResv(char *pBuffer)
{
int nLen,nWrite;
int nOffset;
nOffset=m_nOffset;
nWrite=MyComFile.WriteFileBuf(m_gRecvPath,pBuffer, m_nLen,nOffset);
m_nIsRecvd = MyComFile.GetFileSize(m_gRecvPath);
m_nMessage =MESSAGE_SEND;
m_nLen = 0;//通知发送端继续发送
m_nOffset = m_nIsRecvd;//重新定位偏移量,防止传送不全
//strcpy(pBuffer,"end");//通知此次发送完成
nLen=MyComFile.WriteFile(fd,pBuffer, MAXBUF);//接收的时候,写入随便数据证明接收完毕即可即可
return nLen;
}
void CCom::MessageEnd()
{
MyComThread.ExitThread();
}
linux c++ 简单串口通信
5星 · 超过95%的资源 需积分: 44 58 浏览量
2013-03-24
22:47:44
上传
评论 6
收藏 426KB RAR 举报
xiaocai209
- 粉丝: 0
- 资源: 2
最新资源
- 2%EF%BC%9A%E9%99%95%E8%A5%BF%E
- yyspdz62_944.apk
- SAP公司间采购EDI配置-如何触发自动MIRO.docx
- python197基于图像识别的仪表实时监控系统.rar
- python196基于循环神经网络的情感分类系统.rar
- I2C驱动SHT30温湿度传感器和LCD12864使用例程(RSCG12864B)
- python193中学地理-中国的江河湖泊教学网(django).rar
- python191基于时间序列分析的大气污染预测软件(django).rar
- python190基于人脸识别智能化小区门禁管理系统.rar
- python189某医院体检挂号系统.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页