首页 > 开发 > PHP > 正文

读写串行口数据,理论上很简单,PHP倒没试过。。。

2024-05-04 22:56:05
字体:
来源:转载
供稿:网友
我没看过php源码,但它有文件操作函数,我想应该可以吧?实在不行,那么做个cgi来实现也可以,而且独立性好,容易维护。以前我在bcb环境下做过,思路如下:(其实相当于普通的文件读写操作,呵呵)

一、打开文件

//先用文件方式打开一个串口(com1~~com4中任一个)
handle m_hcomm = createfile("com2", generic_read | generic_write, null, open_existing, file_flag_overlapped, 0);

然后就可以用writefile()和readfile()来对串行口进行读写了,最后记得closehandle(m_hcomm);把当前打开的串行口关闭哦。
由于createfile()函数采用file_flag_overlapped常量,那么注意一下writefile()和readfile()函数的最后一个参数是overlapped结构的,读写前需要先初始化该结构:

overlapped m_ov;

m_ov.offset = 0;
m_ov.offsethigh = 0;
m_ov.hevent = null;

好了,上面已经打开com2,那么就进行简单读写:

二、写:

bool bresult = true;
char* m_writebuffer;
dword bytessent = 0;

strcpy(m_writebuffer, "试试写进去");
bresult = writefile(m_hcomm, m_writebuffer, strlen((char*)m_writebuffer), &bytessent, m_ov);


三、读:

comstat comstat;//该结构包含通信设备的状态。
bool bresult = true;
dword dwerror = 0;
dword bytesread = 0;
unsigned char m_readbuff;
//开始循环读
for (;;)
{
  bresult = clearcommerror(m_hcomm, &dwerror, &comstat);//更新comstat结构并清除所有错误
  if (comstat.cbinque == 0)
  {
    break;//如果读完了就退出for循环
  }

  bresult = readfile(m_hcomm, &readbuff, 1, &bytesread, m_ov);//一次读一位,如果喜欢,你也可以一次读n位
  ......
  //在这里放入你的处理模块,反正readbuff里是内容(1位),可以合并起来......
  ......
}

四、关掉
closehandle(m_hcomm);


以上思路可以通过函数返回值进行错误处理,至于各错误常量的意思可以查书,完整处理是麻烦点,知道方法就可以了,只要你是简单应用,那么简单读写就足够了。这个文件读写方式还适用于打印口lpt1、lpt2~~~lptn。在unix下我没试过,但既然unix类的操作系统比windows更加强调设备文件,相信在unix、linux下用文件方式读写com口更简单更通用吧。。。?还是这句:知道方法就行。该出手时就出手。^_^
不过如果在unix、linux下作为cgi来用的话,可能要设置编译后cgi文件的权限,自己试哦。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表