linux下串口通信 读写问题

么特里亚 2013-08-15 04:37:07
小弟最近看了下 串口通信,试着写了一个,但是现在实现了自发自接,和串口调试助手 只能发送数据,接收不到数据,找不到原因,还请各位帮忙,代码贴下
...全文
114 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
linlan999 2013-08-19
  • 打赏
  • 举报
回复
么特里亚 2013-08-19
  • 打赏
  • 举报
回复
原因已经找到,如果有人遇到和我一样相同的问题,可以去我博客找找解决办法
么特里亚 2013-08-15
  • 打赏
  • 举报
回复
如果有比较完善的串口通信代码,请发我一份,谢谢了
么特里亚 2013-08-15
  • 打赏
  • 举报
回复
#include <stdio.h>      /*标准输入输出定义*/
#include <stdlib.h>     /*标准函数库定义*/
#include <unistd.h>     /*Unix 标准函数定义*/
#include <sys/types.h>  
#include <sys/stat.h>   
#include <fcntl.h>      /*文件控制定义*/
#include <termios.h>    /*PPSIX 终端控制定义*/
#include <errno.h>      /*错误号定义*/
#include <string.h>

#define FALSE -1
#define TRUE 0
#define LENGTH 12

int speed_arr[] = {B38400,B19200,B9600,B4800,B2400,B1200,B300,B38400,B19200,B9600,B4800,B2400,B1200,B300};

int name_arr[] = {38400,19200,9600,4800,2400,1200,300,38400,19200,9600,4800,2400,1200,300};

int OpenDev(char *Dev);
void set_speed(int fd, int speed);
int set_Parity(int fd, int databits, int stopbits, int parity);

int main(int argc, char **argv)
{
	int fd;
	int nread;
	int count = 0;//计算收发次数
	char *dev  = "/dev/ttyS4"; //USB串口
	fd = OpenDev(dev);
	tcflush(fd, TCIFLUSH);
	set_speed(fd,38400);
	if (set_Parity(fd,8,1,'N') == FALSE)  
	{
		printf("Set Parity Error\n");
		exit (0);
	}
	char send[LENGTH] = {0xC0,0xAA,0x01,0x80,0x00,0x00,0xF7,0x3F,0x04,0x4C,0xC0,0x0A};
	char send[LENGTH] = "hello,world\n";
	char recv[100] = {0};
	//fgets(send,LENGTH,stdin);
//	for(count=1;count<=3;++count)
//	{
	printf("##################\n");	
//	printf("这是第%d次收发\n",count);
	count = write(fd, send, LENGTH);
	printf("写入的%d个字节\n",count);
	int i =0;
	for(i;i<LENGTH;++i)
	{
	    printf("send: %x\n", send[i]);
  	}
//	while(1)
//	{
	while((nread = read(fd,recv,512)) > 0)
	{
		printf("Len:  %d\n", nread);
		int j = 0;
		for(j;j<nread;++j)
		{
			printf("recv:%x\n", recv[j]);
		}
	}
	if(nread<0){
		perror("read:");
	}

	printf("read =  %d\n\n",nread);
	
	printf("##########################\n");
//	sleep(5);
//	}
//	}
	close(fd);  
	return 0;
}

/**
 * *@brief  设置串口通信速率
 * *@param  fd     类型 int  打开串口的文件句柄
 * *@param  speed  类型 int  串口速度
 * *@return  void
 * */
void set_speed(int fd, int speed)
{
	int   i; 
	int   status; 
	struct termios   Opt;
	tcgetattr(fd, &Opt); 
	for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++) 
	{ 
		if  (speed == name_arr[i]) 
		{     
			tcflush(fd, TCIOFLUSH);     
			cfsetispeed(&Opt, speed_arr[i]);  
			cfsetospeed(&Opt, speed_arr[i]);   
			status = tcsetattr(fd, TCSANOW, &Opt);  
			if  (status != 0) 
			{        
				perror("tcsetattr fd");  
				return;     
			}    
			tcflush(fd,TCIOFLUSH);   
		}  
	}
}

/**
 * *@brief   设置串口数据位,停止位和效验位
 * *@param  fd     类型  int  打开的串口文件句柄
 * *@param  databits 类型  int 数据位   取值 为 7 或者8
 * *@param  stopbits 类型  int 停止位   取值为 1 或者2
 * *@param  parity  类型  int  效验类型 取值为N,E,O,S
 * */
int set_Parity(int fd,int databits,int stopbits,int parity)
{ 
	struct termios options; 
	if  ( tcgetattr( fd,&options)  !=  0) 
	{ 
		perror("SetupSerial 1");     
		return(FALSE);  
	}
	options.c_cflag &= ~CSIZE; 
	switch (databits) /*设置数据位数*/
	{   
		case 7:		
			options.c_cflag |= CS7; 
			break;
		case 8:     
			options.c_cflag |= CS8;
			break;   
		default:    
			fprintf(stderr,"Unsupported data size\n"); 
			return (FALSE);  
	}
	switch (parity) 
	{   
		case 'n':
		case 'N':    
			options.c_cflag &= ~PARENB;   /* Clear parity enable */
			options.c_iflag &= ~INPCK;     /* Enable parity checking */ 
			break;  
		case 'o':   
		case 'O':     
			options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/  
			options.c_iflag |= INPCK;             /* Disnable parity checking */ 
			break;  
		case 'e':  
		case 'E':   
			options.c_cflag |= PARENB;     /* Enable parity */    
			options.c_cflag &= ~PARODD;   /* 转换为偶效验*/     
			options.c_iflag |= INPCK;       /* Disnable parity checking */
			break;
		case 'S': 
		case 's':  /*as no parity*/   
			options.c_cflag &= ~PARENB;
			options.c_cflag &= ~CSTOPB;break;  
		default:   
			fprintf(stderr,"Unsupported parity\n");    
			return (FALSE);  
	}  
	/* 设置停止位*/  
	switch (stopbits)
	{   
		case 1:    
			options.c_cflag &= ~CSTOPB;  
			break;  
		case 2:    
			options.c_cflag |= CSTOPB;  
			break;
		default:    
			fprintf(stderr,"Unsupported stop bits\n");  
			return (FALSE); 
	} 
	/* Set input parity option */ 
	if (parity != 'n')   
		options.c_iflag |= INPCK; 
	tcflush(fd,TCIFLUSH);
	options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/   
	options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
	if (tcsetattr(fd,TCSANOW,&options) != 0)   
	{ 
		perror("SetupSerial 3");   
		return (FALSE);  
	} 
	return (TRUE);  
}

/**********************************************************************
 * 代码说明:使用usb串口测试的,发送的数据是字符,
 * 但是没有发送字符串结束符号,所以接收到后,后面加上了结束符号。
   * **********************************************************************/
/*********************************************************************/

int OpenDev(char *Dev)
{
	int fd = open(Dev, O_RDWR|O_NOCTTY);//阻塞方式         //| O_NOCTTY | O_NDELAY	非阻塞
	if (-1 == fd)	
	{ 			
		perror("Can't Open Serial Port");
		return -1;		
	}	
	else	
		return fd;
}

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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