C语言串口调用

HelegeHeHeha 2018-04-27 01:16:53
int main(void)
{
int fd,i=0,j=0,fasong,getdata,Flag;
unsigned char pre_sen[4]={0x01,0x84,0x00,0x43};//数据获取发送
unsigned char pre_rec[10];


struct termios newtio;

fd=open(DATA_COM,O_RDWR);
if(fd==-1)
{
return -1;
}

bzero( &newtio, sizeof( newtio ) );//配置串口
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~PARENB;
newtio.c_cflag &= ~CSTOPB;
newtio.c_cflag &= ~CSIZE;
newtio.c_cflag |= CS8;
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;

tcflush(fd,TCIFLUSH);
if((tcsetattr(fd,TCSANOW,&newtio))!=0)
{
perror("com set error");
return -1;
}

fasong=write(fd,pre_sen,sizeof(pre_sen));//写
if(fasong<0){
printf("write failed");
}

for(j=0;j<4;j++)
printf("send:%x\n",pre_sen[j]);

getdata=read(fd,pre_rec,sizeof(pre_rec));

for(i=0;i<10;i++)
printf("%x\n",pre_rec[i]);
printf("\n%d",getdata);


close(fd);

}

我这个程序为什么写不进去串口,请大神指点
...全文
1575 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
白色一大坨 2018-04-28
  • 打赏
  • 举报
回复
之前刚好做过linux下的串口,分享给你看看,可以配合找找问题。 首先是打开串口,我们设备的串口是固定一个,名字是ttyPS1:

	m_hCom = ::open("/dev/ttyPS1", O_RDWR | O_NOCTTY | O_NONBLOCK);

	if(m_hCom==-1) return false;
	
	struct termios options;
	tcgetattr(m_hCom, &options);
	struct termios newtio;
	switch (m_nBaudRate)//设置数据传输率
	{
	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;
	case 115200:
		cfsetispeed(&newtio, B115200);
		cfsetospeed(&newtio, B115200);
		break;
	default:
		cfsetispeed(&newtio, B9600);
		cfsetospeed(&newtio, B9600);
		break;
	}
	//修改控制模式,保证程序不会占用串口   
	newtio.c_cflag |= CLOCAL;
	//修改控制模式,使得能够从串口读取输入数据   
	newtio.c_cflag |= CREAD;
	newtio.c_cflag &= ~CRTSCTS;
	switch (m_DataBits)//设置数据位
	{
	case 5:
		newtio.c_cflag |= CS5;
		break;
	case 6:
		newtio.c_cflag |= CS6;
		break;
	case 7:
		newtio.c_cflag |= CS7;
		break;
	case 8:
		newtio.c_cflag |= CS8;
		break;
	}

	switch (m_nParityIndex)//设置奇偶效验位
	{
	case 0:
		newtio.c_cflag &= ~PARENB;
		break;
	case 1:
		//newtio.c_iflag |= (INPCK | ISTRIP);
		newtio.c_cflag |= PARENB;
		newtio.c_cflag &= ~PARODD;
		break;
	case 2:
		newtio.c_cflag |= PARENB;
		newtio.c_cflag |= PARODD;
		//newtio.c_iflag |= (INPCK | ISTRIP);
		break;
	}

	switch (m_nStopBitsIndex)
	{
	case 1:
		newtio.c_cflag |= CSTOPB;
		break;
	default:
		newtio.c_cflag &= ~CSTOPB;
		break;
	}

	//修改输出模式,原始数据输出   
	newtio.c_oflag *= ~OPOST;

	newtio.c_cc[VTIME] = 1;
	newtio.c_cc[VMIN] = 1;
	tcflush(m_hCom, TCIFLUSH);

	if ((tcsetattr(m_hCom, TCSANOW, &newtio)) != 0)
	{//激活新配置
		::close(m_hCom);
		m_hCom = -1;
		return false;
	}
然后是发送部分,buff是char数组,nlen是发送长度:

		nRet = write(hComm, buff, nLen);
		if (nRet < 0)
		{
			return KSJVB_RET_FAIL;
		}
赵4老师 2018-04-28
  • 打赏
  • 举报
回复
百度搜“Linux操作系统下串口编程入门教程”
白色一大坨 2018-04-28
  • 打赏
  • 举报
回复
引用 7 楼 leetow2006 的回复:
原来ttyPS1是串口设备名称,学习了
这个可不一定的,不过很多设备都会叫这个罢了,具体还要看设备,不像Windows下面,定好了就叫com1 com2
leetow2006 2018-04-28
  • 打赏
  • 举报
回复
原来ttyPS1是串口设备名称,学习了
HelegeHeHeha 2018-04-27
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
百度搜相关关键字。
已经搜了两天了,程序改了好多遍,都不行啊
HelegeHeHeha 2018-04-27
  • 打赏
  • 举报
回复
引用 1 楼 hzy_76 的回复:
調試過沒有,能按預期執行到哪一步?
用USB转串口的线连接到PC上,在串口调试工具里面都看不到返回数据,估计是都没写进去
赵4老师 2018-04-27
  • 打赏
  • 举报
回复
百度搜相关关键字。
老马何以识途 2018-04-27
  • 打赏
  • 举报
回复
調試過沒有,能按預期執行到哪一步?

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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