Ejemplo n.º 1
0
/**
 * throws EXIT_FAILURE if could not open the port
 */
int
Serial_Port::
open_serial()
{

	// --------------------------------------------------------------------------
	//   OPEN PORT
	// --------------------------------------------------------------------------
	//printf("OPEN PORT\n");

	fd = _open_port(uart_name);

	// Check success
	if (fd == -1) {
		//printf("failure, could not open port.\n");
		return -1;
		//throw EXIT_FAILURE;
	}

	// --------------------------------------------------------------------------
	//   SETUP PORT
	// --------------------------------------------------------------------------
	bool success = _setup_port(baudrate, 8, 1, false, false);

	// --------------------------------------------------------------------------
	//   CHECK STATUS
	// --------------------------------------------------------------------------
	if (!success) {
		printf("failure, could not configure port.\n");
		//throw EXIT_FAILURE;
		return -1;
	}

	if (fd <= 0) {
		printf("Connection attempt to port %s with %d baud, 8N1 failed, exiting.\n", uart_name, baudrate);
		//throw EXIT_FAILURE;
		return -1;
	}

	// --------------------------------------------------------------------------
	//   CONNECTED!
	// --------------------------------------------------------------------------
	printf("Connected to %s with %d baud, 8 data bits, no parity, 1 stop bit (8N1)\n", uart_name, baudrate);
	lastStatus.packet_rx_drop_count = 0;

	status = true;

	printf("\n");

	return 0;

}
Ejemplo n.º 2
0
void open_serial()
{
	printf("INITIALIZE \n");
	initialize_defaults();
	// --------------------------------------------------------------------------
	//   OPEN PORT
	// --------------------------------------------------------------------------
	printf("OPEN PORT\n");

	fd = _open_port(uart_name);

	// Check success
	if (fd == -1)
	{
		printf("failure, could not open port.\n");
	}

	// --------------------------------------------------------------------------
	//   SETUP PORT
	// --------------------------------------------------------------------------
	int success = _setup_port(baudrate, 8, 1, 0,0);

	// --------------------------------------------------------------------------
	//   CHECK STATUS
	// --------------------------------------------------------------------------
	if (!success)
	{
		printf("failure, could not configure port.\n");
	}
	if (fd <= 0)
	{
		printf("Connection attempt to port %s with %d baud, 8N1 failed, exiting.\n", uart_name, baudrate);
	}

	// --------------------------------------------------------------------------
	//   CONNECTED!
	// --------------------------------------------------------------------------
	printf("Connected to %s with %d baud, 8 data bits, no parity, 1 stop bit (8N1)\n", uart_name, baudrate);
	lastStatus.packet_rx_drop_count = 0;

	status = 1;

	printf("\n");

	return;

}
Ejemplo n.º 3
0
/**
* @brief 对文件描述符的控制
*
*
* 目前仅支持写的超时时间设置
* 
* @param [in] fd 文件描述符
* @param [in] cmd 命令标识,目前已定义的命令有
* - SWPA_FILE_IOCTL_COMM_SET_TIMEOUT : 写的超时时间设置
* @param [in] args 命令标志参数
* @retval SWPAR_OK : 成功
* @retval SWPAR_FAIL : 失败
*/
int swpa_comm_file_ioctl(
	int fd, 
	int cmd, 
	void* args
)
{
	SWPA_FILEHEADER * pheader = (SWPA_FILEHEADER *)fd;
	COMM_FILE_INFO * pinfo = (COMM_FILE_INFO *)pheader->device_param;	

	
	//参数有效性检查
	SWPA_FILE_CHECK(0 != fd);    	//fd 必须不等于0
	//SWPA_FILE_CHECK(0 < cmd);    	//cmd取值没有限定,故mark掉
	//SWPA_FILE_CHECK(NULL != args);    	//args 在不同cmd下可以为NULL,故mark掉

	//参数打印
	SWPA_FILE_PRINT("fd=%d\n", fd);	
	SWPA_FILE_PRINT("cmd=%d\n", cmd);	
	SWPA_FILE_PRINT("args=0x%08x\n", args);
	
	switch (cmd)
	{
		case SWPA_FILE_IOCTL_COMM_CLEAR:
			tcflush(fd, TCIOFLUSH);
			return SWPAR_OK;
		case SWPA_FILE_IOCTL_COMM_IS_RS485:
		{
			if (NULL == args)
			{
				SWPA_FILE_PRINT("Err: NULL == args! [%d]\n", pinfo->dev_id, SWPAR_INVALIDARG);
				return SWPAR_INVALIDARG;
			}
			
			int is_rs485 = *(int*)args;
			switch (is_rs485)
			{
				case 0:
					pinfo->is_rs485 = 0;
				break;

				case 1:
					/*no 'break' here */
				default:
					pinfo->is_rs485 = 1;
					if (0 == (0 == pinfo->dev_id ? _rs485_lock_1 : _rs485_lock_2)
						&& SWPAR_OK != swpa_mutex_create((0 == pinfo->dev_id ? &_rs485_lock_1 : &_rs485_lock_2), NULL))
					{
						SWPA_FILE_PRINT("Err: failed to create rs485 %d lock! [-1]\n", pinfo->dev_id);
						return SWPAR_FAIL;
					}
				break;
			}
		}
		break;
		
		case SWPA_FILE_IOCTL_COMM_SET_ATTR:
		{
			char * argstr = (char *)args;
			int baudrate  , databits, stop;
			char parity;
			char * str = NULL;

			SWPA_FILE_PRINT("Info: argstr=%s\n", argstr);
			
			str = swpa_strstr(argstr, "baudrate");
			if (NULL != str)
			{
				swpa_sscanf(str, "baudrate:%d", &baudrate);
				switch (baudrate)
				{
					//case 2400:			
			        case 4800:
			        case 9600:
			        case 19200:
					case 38400:
			        case 115200:
			        //case 460800:
			            baudrate = baudrate;
		            break;
					
			        default:
			            SWPA_FILE_PRINT("Err: invalid baudrate (%d)!\n", baudrate );
			            return SWPAR_INVALIDARG;
				}
			}
			else
			{
				SWPA_FILE_PRINT("Err: no baudrate value [%d]!\n", SWPAR_INVALIDARG);
				return SWPAR_INVALIDARG;
			}

			//设置数据长度
			str = swpa_strstr(argstr, "databits");
			if (NULL != str)
			{
				swpa_sscanf(str, "databits:%d", &databits);
				switch (databits)
			    {
			        //case 5:	
			        //case 6:
			        case 7:
			        case 8:
			            databits = databits;
		            break ;
					
			        default:
			            SWPA_FILE_PRINT("Err: invalid data bits (%d)!\n", databits);
			            return SWPAR_INVALIDARG ;
			    }
			}
			else
			{
				SWPA_FILE_PRINT("Err: no data bits value [%d]!\n", SWPAR_INVALIDARG);
				return SWPAR_INVALIDARG;
			}
			

			//设置奇偶校验位
			str = swpa_strstr(argstr, "parity");
			if (NULL != str)
			{
				swpa_sscanf(str, "parity:%c", &parity);
				switch (parity)
				{
					case 'n': case 'N':
			        case 'o': case 'O':
			        case 'e': case 'E':
			        //case 'S': case 's':  //as no parity
				        parity = parity;
					break;

			        default:
			            SWPA_FILE_PRINT("Err: invalid parity value (%d)!\n", parity);
			            return SWPAR_INVALIDARG;
				}
			}
			else
			{
				SWPA_FILE_PRINT("Err: no parity value [%d]!\n", SWPAR_INVALIDARG);
				return SWPAR_INVALIDARG;
			}

			//设置停止位
			str = swpa_strstr(argstr, "stop");
			if (NULL != str)
			{
				swpa_sscanf(str, "stop:%d", &stop);
				switch (stop)
				{
					case 1:
			        case 2:
			            stop = stop;
		            break;
					
			        default:
			            SWPA_FILE_PRINT("Err: invalid stop bits lenght (%d)!\n", stop);
			            return SWPAR_INVALIDARG;
				}
			}
			else
			{
				SWPA_FILE_PRINT("Err: no stop bit value [%d]!\n", SWPAR_INVALIDARG);
				return SWPAR_INVALIDARG;
			}
			
			return _setup_port(pinfo->fd, baudrate, databits, parity, stop);
		}			
		break;
		
		case SWPA_FILE_SET_READ_TIMEOUT :
		{
			pinfo->read_timeout = *(int *)args;
			return SWPAR_OK;
		}
		break;
		
		case SWPA_FILE_SET_WRITE_TIMEOUT :
		{
			pinfo->write_timeout = *(int *)args;
			return SWPAR_OK;
		}
		break;

		default:
			SWPA_FILE_PRINT("Err: invalid cmd for comm file! [%d]\n", SWPAR_INVALIDARG);
			return SWPAR_INVALIDARG;
	}

	return SWPAR_OK;	
}