int main(void) { struct client *cl = (struct client *)malloc(sizeof(struct client)); cl->state = initial; cl->inbuf = 0; cl->fd = open("/dev/ttyUSB0", O_RDWR); if (cl->fd < 0) { fprintf(stderr, "Can't open the uart\n"); exit(1); } set_speed(cl->fd, 115200); if (set_parity(cl->fd, 8, 1, 'N') == FALSE) { fprintf(stderr, "Set Parity Error\n"); exit(0); } /* Infinite while loop -- server must be killed */ while (1) { processclient(cl); } printf("-------------------\n"); free(cl); close(cl->fd); return 1; }
/* * card_uart_setup - specail setup for card reader UART * @fd : card reader fd * @return : status */ int card_uart_setup(int fd) { #if 1 struct termios option; memset(&option, 0, sizeof(option)); option.c_cflag = B9600|CS8|CLOCAL|CREAD; option.c_iflag = IGNPAR; option.c_oflag = 0; option.c_lflag = 0; option.c_cc[VMIN] = 0; option.c_cc[VTIME] = 30; tcflush(fd, TCIFLUSH); if(tcsetattr(fd, TCSANOW, &option) < 0){ return FAIL; } #else int ret; set_speed(fd, 9600); ret = set_parity(fd, 8, 1, 'N'); if (ret < 0) return FAIL; #endif return SUCCESS; }
int xmos_dev_open() { int fd_xmos = open_serial(SERIAL_DEV); if (fd_xmos == -1) { printf("Cannot open device\n"); return ROKID_XMOS_ERROR_DEVICE_OPEN_FAILED; } int ret; ret = set_speed(fd_xmos, 115200); if (ret == -1) { printf("Set speed failed : %d\n", ret); return ROKID_XMOS_ERROR_INIT_FAILED; } ret = set_parity(fd_xmos, 8, 1, 0); if (ret == -1) { printf("Set parity failed : %d\n", ret); return ROKID_XMOS_ERROR_INIT_FAILED; } back_led_fd = open("/dev/dm163", O_RDWR | O_NONBLOCK); if (back_led_fd < 0) { perror("open dm163 error"); } return fd_xmos; }
static int open_device(const char *tty, GHashTable *options) { struct termios ti; int fd; /* Switch TTY to raw mode */ memset(&ti, 0, sizeof(ti)); cfmakeraw(&ti); if (options) { GHashTableIter iter; const char *key; const char *value; g_hash_table_iter_init (&iter, options); while (g_hash_table_iter_next(&iter, (void *) &key, (void *) &value)) { gboolean ok = FALSE; if (g_str_equal(key, "Baud")) ok = set_baud(value, &ti); else if (g_str_equal(key, "StopBits")) ok = set_stop_bits(value, &ti); else if (g_str_equal(key, "DataBits")) ok = set_data_bits(value, &ti); else if (g_str_equal(key, "Parity")) ok = set_parity(value, &ti); else if (g_str_equal(key, "XonXoff")) ok = set_xonxoff(value, &ti); else if (g_str_equal(key, "RtsCts")) ok = set_rtscts(value, &ti); else if (g_str_equal(key, "Local")) ok = set_local(value, &ti); else if (g_str_equal(key, "Read")) ok = set_read(value, &ti); if (ok == FALSE) return -1; } } fd = open(tty, O_RDWR | O_NOCTTY | O_NONBLOCK); if (fd < 0) return -1; tcflush(fd, TCIOFLUSH); tcsetattr(fd, TCSANOW, &ti); return fd; }
int serial_open(char *port_name, int speed) { int fd = -1; fd = open(port_name, O_RDWR|O_NOCTTY|O_NDELAY); if (fd < 0) { print_err("Failed to open %s\n", port_name); return -1; } set_speed(fd, speed); if (set_parity(fd, 8, 1,'N') < 0) { print_err("Set Parity Error\n"); return -1; } return fd; }
static DBusMessage *proxy_set_serial_params(DBusConnection *conn, DBusMessage *msg, void *data) { struct serial_proxy *prx = data; const char *ratestr, *paritystr; uint8_t databits, stopbits; tcflag_t ctrl; /* Control mode flags */ speed_t speed = B0; /* In/Out speed */ /* Don't allow change TTY settings if it is open */ if (prx->local) return failed(msg, "Not allowed"); if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &ratestr, DBUS_TYPE_BYTE, &databits, DBUS_TYPE_BYTE, &stopbits, DBUS_TYPE_STRING, &paritystr, DBUS_TYPE_INVALID)) return NULL; if (str2speed(ratestr, &speed) == B0) return invalid_arguments(msg, "Invalid baud rate"); ctrl = prx->proxy_ti.c_cflag; if (set_databits(databits, &ctrl) < 0) return invalid_arguments(msg, "Invalid data bits"); if (set_stopbits(stopbits, &ctrl) < 0) return invalid_arguments(msg, "Invalid stop bits"); if (set_parity(paritystr, &ctrl) < 0) return invalid_arguments(msg, "Invalid parity"); prx->proxy_ti.c_cflag = ctrl; prx->proxy_ti.c_cflag |= (CLOCAL | CREAD); cfsetispeed(&prx->proxy_ti, speed); cfsetospeed(&prx->proxy_ti, speed); proxy_store(&prx->src, prx->uuid128, prx->address, NULL, prx->channel, 0, &prx->proxy_ti); return dbus_message_new_method_return(msg); }
int serial_open(char *port_name, int speed,int vtime,int vmin) { int fd = -1; fd = open(port_name, O_RDWR); if (fd < 0) { print_err("Failed to open %s\n", port_name); return -1; } set_speed(fd, speed); if (set_parity(fd, 8, 1,'N') < 0) { print_err("Set Parity Error\n"); return -1; } if(set_mode(fd,vmin,vtime)<0){ print_err("Set mode Error\n"); return -1; } return fd; }
int init_uart_port(char * port) { if (!port) return FALSE; // 打开串口 g_fd = open_serial_port(port); if (g_fd == -1) { perror("open serial failed!\n"); return FALSE; } // 设置串口属性 set_speed(g_fd, UART_DEFAULT_BAUDRATE); if (set_parity(g_fd, 8, 1, 'N') == FALSE) //8位数据,非两位的停止位,不使用奇偶校验 ,不允许输入奇偶校验 { perror("set parity failed!\n"); return FALSE; } return TRUE; }
int main(int argc, char **argv) { int tmp = 0; int fd, fd_gps; char buf[1024]; char uart_name[] = UART_DEV; int i, ret; if (argc >= 2) { strncpy(uart_name, argv[1], sizeof(uart_name)); } fd_gps = open(GPS_DEV, O_RDWR); if(fd_gps < 0) { printf("Failed to open %s\n", GPS_DEV); return -1; } /* power on gps */ ioctl(fd_gps, 1); /* reset gps */ ioctl(fd_gps, 2); sleep(2); for (i = 1; ; i++) { fd = open(uart_name, O_RDWR | O_NOCTTY); printf("Try %d times: %s to open %s\n", i, fd < 0 ? "failed" : "success", uart_name); if (fd >= 0) break; if (fd<0 && i>=3) return -1; sleep(1); } set_speed(fd, 4800); set_parity(fd, 8, 1, 'N'); if (fork()) { while (1) { memset(buf, 0, sizeof(buf)); if (ret = read(fd, buf, sizeof(buf))) { for (i = 0; i < ret; i++) { if (buf[i] == '\n') tmp ++; else tmp = 0; if (tmp >= 2) continue; putchar(buf[i]); } } } } else { while (1) { memset(buf, 0, sizeof(buf)); scanf("%s",buf); write(fd, buf, strlen(buf)); } } close(fd); close(fd_gps); return 0; }
zx_status_t AmlUart::SerialImplConfig(uint32_t baud_rate, uint32_t flags) { // Control register is determined completely by this logic, so start with a clean slate. auto ctrl = Control::Get().FromValue(0); if ((flags & SERIAL_SET_BAUD_RATE_ONLY) == 0) { switch (flags & SERIAL_DATA_BITS_MASK) { case SERIAL_DATA_BITS_5: ctrl.set_xmit_len(Control::kXmitLength5); break; case SERIAL_DATA_BITS_6: ctrl.set_xmit_len(Control::kXmitLength6); break; case SERIAL_DATA_BITS_7: ctrl.set_xmit_len(Control::kXmitLength7); break; case SERIAL_DATA_BITS_8: ctrl.set_xmit_len(Control::kXmitLength8); break; default: return ZX_ERR_INVALID_ARGS; } switch (flags & SERIAL_STOP_BITS_MASK) { case SERIAL_STOP_BITS_1: ctrl.set_stop_len(Control::kStopLen1); break; case SERIAL_STOP_BITS_2: ctrl.set_stop_len(Control::kStopLen2); break; default: return ZX_ERR_INVALID_ARGS; } switch (flags & SERIAL_PARITY_MASK) { case SERIAL_PARITY_NONE: ctrl.set_parity(Control::kParityNone); break; case SERIAL_PARITY_EVEN: ctrl.set_parity(Control::kParityEven); break; case SERIAL_PARITY_ODD: ctrl.set_parity(Control::kParityOdd); break; default: return ZX_ERR_INVALID_ARGS; } switch (flags & SERIAL_FLOW_CTRL_MASK) { case SERIAL_FLOW_CTRL_NONE: ctrl.set_two_wire(1); break; case SERIAL_FLOW_CTRL_CTS_RTS: // CTS/RTS is on by default break; default: return ZX_ERR_INVALID_ARGS; } } // Configure baud rate based on crystal clock speed. // See meson_uart_change_speed() in drivers/amlogic/uart/uart/meson_uart.c. constexpr uint32_t kCrystalClockSpeed = 24000000; uint32_t baud_bits = (kCrystalClockSpeed / 3) / baud_rate - 1; if (baud_bits & (~AML_UART_REG5_NEW_BAUD_RATE_MASK)) { zxlogf(ERROR, "%s: baud rate %u too large\n", __func__, baud_rate); return ZX_ERR_OUT_OF_RANGE; } auto baud = Reg5::Get() .FromValue(0) .set_new_baud_rate(baud_bits) .set_use_xtal_clk(1) .set_use_new_baud_rate(1); fbl::AutoLock al(&enable_lock_); if ((flags & SERIAL_SET_BAUD_RATE_ONLY) == 0) { // Invert our RTS if we are we are not enabled and configured for flow control. if (!enabled_ && (ctrl.two_wire() == 0)) { ctrl.set_inv_rts(1); } ctrl.WriteTo(&mmio_); } baud.WriteTo(&mmio_); return ZX_OK; }