近来手上有一个项目是需要通过串口与GPRS模块通信的,我拿到GPRS模块后,由于主控制器这边的硬件还没结束,所以就先在PC上测试了一下GPRS模块的基本功能,用sccom32一个命令一个命令地发,收到的数据是正常的,但自己写的程序在cygwin上测试时就有问题了,收不到正确的数据,郁闷了好久,今天总算是找到其它办法来测试了。
主板与gprs模块的通信是有一个协议的,比如我要连接时就发送DC 75 A1 00 11 00 77 77 77 2E 62 61 69 64 75 2E 63 6F 6D 3A 38 30 46,当能连接时GPRS会回给主板DC 75 A2 00 02 00 01 08,如果连不了时会回给主板DC 75 A2 00 02 00 00 09,我自己在sccom32上用hex发送模式将DC 75 A1 00 11 00 77 77 77 2E 62 61 69 64 75 2E 63 6F 6D 3A 38 30 46发出去,不到2秒就收到了DC 75 A2 00 02 00 01 08,好了,这下可以确定通信没有啥问题了,但我自己写一个程序就不正常了。
int main(int argc, char *argv[])
{
int rcvlen, j, x = 0;
set_signal_handlers();
fd_uart = uart_open();
if (fd_uart < 0) {
fprintf(stdout, "uart is not ready\n");
goto out;
}
unsigned char payload[] = "";
unsigned char dat[128] = {0};
unsigned char len = 0, wlen = 0, rlen = 0;
unsigned char checksum = 0;
int i;
fprintf(stdout, "GPRS Module test\n");
fprintf(stdout, "-----------------------------------------\n");
// TCPIP Connect
dat[0] = 0xDC;
dat[1] = 0x75;
dat[2] = 0xA1;
dat[3] = 0x00;
dat[4] = 1 + strlen(payload);
dat[5] = 0x00;
len = 6;
strcpy(&dat[6], payload);
len += strlen(payload);
fill_checksum(dat, len);
len++;
fprintf(stdout, "TCPIP Connect: connect %s on socket %d\n", payload, 0);
fprintf(stdout, "--> GPRS: \n");
dump_dat(dat, len);
// xmit & read ACK
wlen = 0;
uart_write(fd_uart, dat, len, &wlen, 10);
rlen = 0;
memset(dat, 0, sizeof(dat));
uart_read(fd_uart, dat, 8, &rlen, 60);
fprintf(stdout, "TCPIP Connect Status\n");
fprintf(stdout, "<-- GPRS: \n");
dump_dat(dat, rlen);
out:
prepare_exit();
return 0;
}
打印出来的结果是:
GPRS Module test
TCPIP Connect: connect on socket 0
--> GPRS:
DC 75 A1 00 11 00 77 77 77 2E 62 61 69 64 75 2E 63 6F 6D 3A 38 30 46
TCPIP Connect Status
<-- GPRS:
00 00 A2 00 02 00 01 08
最后一行表示PC串接收到的数据,能连通时收到00 00 A2 00 02 00 01 08,如果连不通的话,收到00 00 A2 00 02 00 00 09,我想不通为什么前在DC 75全部都没有了,但在sccom32上都收到正常的,这下让我纳闷了。怎么办呢?
突然我想到了,用自己在开发板(DEVKIT8500)在LINUX上测试一下试试,将PL2303 USB串口插到板子上的USB口
usb 1-1.4: new full speed USB device using ehci-omap and address 3
root@dm37x-evm:root# insmod /lib/modules/2.6.32/kernel/drivers/usb/serial/usbser
ial.ko
usbcore: registered new interface driver usbserial
USB Serial support registered for generic
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial Driver core
root@dm37x-evm:root# insmod /lib/modules/2.6.32/kernel/drivers/usb/serial/pl2303
.ko
USB Serial support registered for pl2303
pl2303 1-1.4:1.0: pl2303 converter detected
usb 1-1.4: pl2303 converter now attached to ttyUSB0
usbcore: registered new interface driver pl2303
pl2303: Prolific PL2303 USB to serial adaptor driver
从打印可以看到串口设置节点已经创建了,来查看一下:
root@dm37x-evm:root# ls /dev/ttyUSB*
/dev/ttyUSB0
节点文件已经有了,接下来准备好GPRS模块,插上SIM卡,然后运行自己的GPRS模块测试程序
root@dm37x-evm:root# ./gprs_test
open /dev/ttyUSB0 .....
fcntl=0
isatty success!
set done!
GPRS Module test
TCPIP Connect: connect 46.4.103.80:9999 on socket 0
--> GPRS:
DC 75 A1 00 11 00 34 36 2E 34 2E 31 30 33 2E 38 30 3A 39 39 39 39 01
TCPIP Connect Status
<-- GPRS:
DC 75 A2 00 02 00 01 08
从打印DC 75 A2 00 02 00 01 08来看,跟服务器已经连上了,面且数据头上的DC 75也正常得到了。
由上面的测试可见,在WINXP下,PL2303的串口驱动应该没有什么大问题,否则SCCOM32得不到正常的数据,同时在devkit8500开发板上也没有问题,那十有八九就是cygwin的问题了,所以以后在cygwin下通过串口进行通信时还是还执有一些怀疑态度比较好。这个完全是个人推断,并不保证正确,但可以拿来参考,而且建议最好用好一点的USB串口,我用过FTDI的,比较稳定。
阅读(4016) | 评论(0) | 转发(0) |