|
楼主 |
发表于 2011-2-7 20:32:59
|
显示全部楼层
2. 第一个程序:通过Bluetooth读回NXT主机的电池状态
本帖最后由 grant7788 于 2011-2-7 20:42 编辑
话说楼主搜了一下,找到一个老外的例程。原文链接如下:http://www.extremenxt.com/vbpart1.htm
可是楼主对VB 2005不熟啊... 知识老化了不是么...
用VB6试一下吧,居然,有种种限制。也是,VB6对串口操作,简单还行,复杂的是比较麻烦一点儿。
算了,咱还是用VC6吧。这玩艺儿灵活啊。试了一下,还真行。
我写程序一般不大写界面的,大家只看实现方法吧,哈哈~
VC下对串口的操作,基本上是通过文件操作的方式来实现的。
CreateFile打开串口,
ReadFile从串口读回数据,
WriteFile把数据写到串口。
上面说“基本上”,其实,VC下还是可以通过端口操作的方式来控制串口的。
什么什么?那位同学说,Windows 95以后就不能用inport / outport了?
嗯,不错,还是比较有常识的。
可是,难道,不能写一个简单的设备驱动程序,来进行端口操作吗?
刚才说话的那个同学,这个,就是你今天的回家作业了!- #include <windows.h>
- #include <winbase.h>
- #include <stdio.h>
- #include <conio.h>
- void main()
- {
- HANDLE hCom;
- BOOL iRetVal;
- DWORD iErrCode;
- LPVOID lpMsgBuf;
- char byteOut[6];
- char byteIn[7];
- DWORD iBytes;
- int sVolt;
- int i;
- printf("Press any key to start...\n");
- getch();
-
- // 打开串口。在我的电脑上NXT主机的Bluetooth对应COM8
- hCom=CreateFile("COM8", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
- if(hCom==(HANDLE)-1)
- {
- printf("打开COM失败!\n");
- return;
- }
- printf("BlueTooth opened!\n");
- printf("Press any key to continue...\n");
- getch();
-
- COMMTIMEOUTS TimeOuts;
- //设定读超时
- TimeOuts.ReadIntervalTimeout=MAXDWORD;
- TimeOuts.ReadTotalTimeoutMultiplier=0;
- TimeOuts.ReadTotalTimeoutConstant=0;
-
- //设定写超时
- TimeOuts.WriteTotalTimeoutMultiplier=100;
- TimeOuts.WriteTotalTimeoutConstant=500;
- iRetVal = SetCommTimeouts(hCom,&TimeOuts); //设置超时
-
- DCB dcb;
- iRetVal = GetCommState(hCom,&dcb);
- // 设定串口参数
- dcb.BaudRate = 96000; //波特率为9600
- dcb.ByteSize = 7; //每个字节有7位
- dcb.Parity = 2; //偶校验
- dcb.StopBits = 0; //无停止位
- iRetVal = SetCommState(hCom, &dcb);
- if (iRetVal == 0)
- {
- iErrCode = GetLastError();
- FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, iErrCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
- printf("%s\n", lpMsgBuf);
- getch();
- CloseHandle(hCom);
- return;
- }
-
- PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
- printf("Bluetooth port opened!\n");
- // 以下发命令到NXT主机
- byteOut[0] = 0x2; // 消息长度2字节
- byteOut[1] = 0x0; // NXT为0
- byteOut[2] = 0x0; // 需要回复。如不需要回复为0x80
- byteOut[3] = 0xB; // 0x0B为读回电池状态
- iRetVal = WriteFile(hCom, byteOut, 4, &iBytes, NULL);
- printf("Write to BlueTooth %d bytes!\n", iBytes);
- printf("Press any key to continue...\n");
- getch();
- // 从NXT主机读回数据,前两字节代表消息长度
- iRetVal = ReadFile(hCom, &byteIn[0], 1, &iBytes, NULL); // 返回消息字节数
- iRetVal = ReadFile(hCom, &byteIn[1], 1, &iBytes, NULL); // NXT为0
- printf("Byte 0 = %d\n", byteIn[0]);
- for (i=2; i<=byteIn[0]+1; i++)
- {
- iRetVal = ReadFile(hCom, &byteIn[i], 1, &iBytes, NULL); // 读回全部消息
- }
- sVolt = byteIn[5] + byteIn[6]*256; // 换算成电压
- printf("Volt = %d\n", sVolt);
- printf("Press any key to close...\n");
- getch();
-
- CloseHandle(hCom);
- }
复制代码
|
|