/****************************************************************************** * 函数: streamdev_open * 功能: 打开数据流设备 * 参数: * 返回: 0 - 成功 * 说明: 无 ******************************************************************************/ struct sdevhandle * streamdev_open(u8 id) { int ret; struct sdevhandle *p; if((id < 0) || (id >= CFG_SDEV_MAX)){ goto error; } switch(id){ case CFG_GPRS_ME3000: sdevhandle[CFG_GPRS_ME3000].setconfig = gprs_me3000_setconfig; sdevhandle[CFG_GPRS_ME3000].getconfig = gprs_me3000_getconfig; sdevhandle[CFG_GPRS_ME3000].send = gprs_me3000_send; sdevhandle[CFG_GPRS_ME3000].recv = gprs_me3000_recv; sdevhandle[CFG_GPRS_ME3000].sendsmg = gprs_me3000_sendsmg; sdevhandle[CFG_GPRS_ME3000].recvsmg = gprs_me3000_recvsmg; sdevhandle[CFG_GPRS_ME3000].connect = gprs_me3000_connect; sdevhandle[CFG_GPRS_ME3000].disconnect = gprs_me3000_disconnect; sdevhandle[CFG_GPRS_ME3000].getstat = gprs_me3000_getstat; sdevhandle[CFG_GPRS_ME3000].turnon = gprs_me3000_turnon; sdevhandle[CFG_GPRS_ME3000].turnoff = gprs_me3000_turnoff; sdevhandle[CFG_GPRS_ME3000].poweron = gprs_me3000_poweron; sdevhandle[CFG_GPRS_ME3000].poweroff = gprs_me3000_poweroff; sdevhandle[CFG_GPRS_ME3000].reset = gprs_me3000_reset; ret = gprs_me3000_init(); if (ret){ goto error; } p = (struct sdevhandle *)&sdevhandle[CFG_GPRS_ME3000]; break; case CFG_SDEV_485: sdevhandle[CFG_SDEV_485].setconfig = sdev_485_setconfig; sdevhandle[CFG_SDEV_485].getconfig = sdev_485_getconfig; sdevhandle[CFG_SDEV_485].send = sdev_485_send; sdevhandle[CFG_SDEV_485].recv = sdev_485_recv; sdevhandle[CFG_SDEV_485].sendsmg = sdev_485_sendsmg; sdevhandle[CFG_SDEV_485].recvsmg = sdev_485_recvsmg; sdevhandle[CFG_SDEV_485].connect = sdev_485_connect; sdevhandle[CFG_SDEV_485].disconnect = sdev_485_disconnect; sdevhandle[CFG_SDEV_485].getstat = sdev_485_getstat; sdevhandle[CFG_SDEV_485].turnon = sdev_485_turnon; sdevhandle[CFG_SDEV_485].turnoff = sdev_485_turnoff; sdevhandle[CFG_SDEV_485].poweron = sdev_485_poweron; sdevhandle[CFG_SDEV_485].poweroff = sdev_485_poweroff; sdevhandle[CFG_SDEV_485].reset = sdev_485_reset; ret = comport_init(CFG_SDEV_485_COMPORT, COMPORT_MODE_485); if (ret){ goto error; } p = (struct sdevhandle *)&sdevhandle[CFG_SDEV_485]; break; case CFG_SDEV_NET: sdevhandle[CFG_SDEV_NET].setconfig = sdev_net_setconfig; sdevhandle[CFG_SDEV_NET].getconfig = sdev_net_getconfig; sdevhandle[CFG_SDEV_NET].send = sdev_net_send; sdevhandle[CFG_SDEV_NET].recv = sdev_net_recv; sdevhandle[CFG_SDEV_NET].sendsmg = sdev_net_sendsmg; sdevhandle[CFG_SDEV_NET].recvsmg = sdev_net_recvsmg; sdevhandle[CFG_SDEV_NET].connect = sdev_net_connect; sdevhandle[CFG_SDEV_NET].disconnect = sdev_net_disconnect; sdevhandle[CFG_SDEV_NET].getstat = sdev_net_getstat; sdevhandle[CFG_SDEV_NET].turnon = sdev_net_turnon; sdevhandle[CFG_SDEV_NET].turnoff = sdev_net_turnoff; sdevhandle[CFG_SDEV_NET].poweron = sdev_net_poweron; sdevhandle[CFG_SDEV_NET].poweroff = sdev_net_poweroff; sdevhandle[CFG_SDEV_NET].reset = sdev_net_reset; p = (struct sdevhandle *)&sdevhandle[CFG_SDEV_NET]; break; default: goto error; break; } return(p); error: return NULL; }
int main(int argc, char **argv) { int opt = 0; int retval = 0; int iRecv = 0; int i; char *dev_name = NULL; int baudrate = 115200; char *settings = "8N1N"; unsigned char aucBuf[512]; unsigned char disp_mode = 0x00; struct sigaction sigact; struct option long_options[] = { {"device", required_argument, NULL, 'd'}, {"baudrate", required_argument, NULL, 'b'}, {"settings", required_argument, NULL, 's'}, {"ioctl", required_argument, NULL, 'i'}, {"hex", no_argument, NULL, 'x'}, {"version", no_argument, NULL, 'v'}, {"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0} }; while ((opt = getopt_long(argc, argv, "d:b:s:ivh", long_options, NULL)) != -1) { switch (opt) { case 'd': dev_name = optarg; break; case 'b': baudrate = atoi(optarg); break; case 's': /* Default settings as 8N1N */ settings = optarg; break; case 'i': if (5 != argc) { usage(argv[0]); } else { do_ioctl(argv[2], atoi(argv[3]), atoi(argv[4])); } return 0; case 'x': /* Display receive data as Hex mode */ disp_mode = 0x01; break; case 'v': /* version */ print_version(argv[0]); return 0; case 'h': /* help */ usage(argv[0]); return 0; default: break; } /* end of "switch(opt)" */ } if (argc < 2) { usage(argv[0]); return 0; } COM_PORT *comport = NULL; if (NULL == (comport = comport_init(dev_name, baudrate, settings))) { printf("Comport initialize failure.\n"); return -1; } if ((retval = comport_open(comport)) < 0) { printf("Failed to open %s with baudrate %d, %s. RetCode [0x%02x]", dev_name, baudrate, settings, retval); return -1; } nonblock(); /* Process level signal handler */ sigemptyset(&sigact.sa_mask); sigact.sa_flags = 0; sigact.sa_handler = signal_handler; sigaction(SIGTERM, &sigact, NULL); /* catch terminate signal */ sigaction(SIGINT, &sigact, NULL); /* catch interrupt signal */ sigaction(SIGSEGV, &sigact, NULL); /* catch segmentation faults */ sigaction(SIGTSTP, &sigact, NULL); /* catch ctrl+Z */ sigaction(SIGSTOP, &sigact, NULL); /* catch ctrl+Z */ while (0x01 == g_ucProcToken) { retval = comport_recv(comport, aucBuf, sizeof(aucBuf) - 1, &iRecv, 10); if (0x00 == retval && 0 < iRecv) { for (i = 0; i < iRecv; i++) { if (0 == disp_mode) printf("%c", aucBuf[i]); else printf("%02X ", aucBuf[i]); } fflush(stdout); } if (0 != kbhit()) { iRecv = fgetc(stdin); if (10 == iRecv) { aucBuf[0] = 13; } else { aucBuf[0] = iRecv; } comport_send(comport, aucBuf, 1); } else if (0x00 != g_ucCtrlZ) { g_ucCtrlZ = 0x00; aucBuf[0] = 0x1A; comport_send(comport, aucBuf, 1); } } comport_term(comport); return 0; } /* ----- End of main() ----- */
/************************************************* API *************************************************/ static int me3000_open(void) { int ret; comport_config_t gprs_cfg = { .baud = 9600, .verify = COMPORT_VERIFY_NO, .ndata = 8, .nstop = 1, .timeout = 0, .rtscts = COMPORT_RTSCTS_ENABLE, }; ret = comport_init(GPRS_COM, COMPORT_MODE_NORMAL); if (ret < 0 && ret != -6) { goto error; } ret = comport_setconfig(GPRS_COM, &gprs_cfg); if (ret < 0 ) { goto error; } error: return ret; } static int me3000_connect(u8 mode, u8 *ip, u16 port) { return 0; } static int me3000_disconnect(int cd) { return 0; } static int me3000_senddata(int cd, u8 *buf, u32 count) { return 0; } static int me3000_sendsms(int cd, u8 *buf, u32 count) { return 0; } static int me3000_turnon(void) { return 0; } static int me3000_turnoff(void) { return 0; } static int me3000_getflow(u8 type) { return 0; } static int me3000_getstat(int cd) { return 0; } static int me3000_getsi(void) { return 0; } gprs_device_t gprs_device[] = { { me3000_open, me3000_connect, me3000_disconnect, me3000_senddata, me3000_sendsms, me3000_turnon, me3000_turnoff, me3000_getflow, me3000_getstat, me3000_getsi }, };