php在部分应用偶尔和串口直接通信,需要和rs232、rs485接口上的数据进行通信。
公司主营业务:成都网站建设、成都网站设计、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出定南免费做网站回馈大家。
php与串口通信,基本有两种途径,通过php扩展dio,下载dio扩展:http://在php.ini打开dio扩展。
dio开启后可以通过dio_opendio_read等函数进行通信。
但dio默认只是在linux下的,好像pecl也有编译后的php_dio.dll,但我在win下测试其实无法正常使用,可能是我php版本太高,dio扩展如果能打开,网上自然有很多实例。
在 php.ini 配置 php_dio.dll
php手册 Direct IO 里面函数的应用 很详细
当然可以。串口助手里设置好就行。比如这样设置:波特率9600,数据位8,停止位1,校验为:奇校验、偶校验、标志位....任选其一。停止位:1.
单片机里按同样设置就行。
11位是一个字节,加了开始位,停止位,还有一个TB8,多机通信地址和数据通信区分位,不是一帧,确切的说是一个字节
楼主概念错误。串口通讯里叫帧,是指完成一次完整的数据传送。一帧里可以包含多个字节(同步通讯),也可以包含一个字节。比如包含了开始位,停止位,还有一个多机通信地址和数据通信区分位TB8的一次异步发送叫一帧。其中有效的信息是一个字节。
单片机工作在方式3,波特率9600,一个开始位,一个停止位,一个TB8区分地址和数据标志位,没有校验位的,校验用的是CRC16的,在串口调试助手里的设置:波特率9600,一个开始位,一个停止位,校验方式设为“无”,为什么没有数据返回呢?在系统里就有数据返回,有人说串口调试助手只能调试8位的数据,而单片机工作在方式3,增加一个TB8位,总共是九位数据,所以串口调试助手调试不了,是这样吗?
你校验方式设置错了啊!咋能设置成
无
呢?
你是要看单片机有没有回传数据对吧?先看发送的是地址还是数据,再看你的SM2位咋个弄的。总之确信单片机程序没错啦,也就是确信有回传数据了,把校验方式设置成:mark.再看。
假设这个页面有一个功能需要操作并返回某字符串,还用一下代码可以实现执行并读取返回值。
$fp = fopen("","r");
$ret= fgetss($fp,255);
echo $ret."br";
fclose($fp);
使用RS-485串口进行通讯。
1.定义串口接收数据的缓冲区,最大可以保存64个字节 u8 RS485_RX_BUF1[64];
2.定义接收发送数据的长度 u8 RS485_RX_CNT;
3.发送数据的函数一般有两个printf和 USART_SendData,这里主要说USART_SendData的使用。printf实现的是格式化字符串,字符串比较有优势。
USART_SendData传递单个字符和指令。
4.给发送方定义一个标记位 u32 flags_send1; flags_send1
5.要发送的事件很多定义一个枚举类型的数据,将所有要发送的事件放入枚举类型数据中。
枚举类型数据将第一个定为1,其他的数据依次加1.
6.定义一个发送事件函数SendCmd(u8 cmd)
定义
7.假设要传递E_CKEYDN_INUSE1事件,要实现事件的传递,就应该将事件做参数传入SendCmd(u8 cmd)函数
此时flags_send1 |= EBIT(9)=;由第四点知道flags_send1是一个32位的无符号整型数据。所以 flags_send1 = 0000 0000 0000 0000 0000 0001 1111 1111
8.(1)UARTSend1()函数
此时的flags_send1 = 0000 0000 0000 0000 0000 0001 1111 1111;
sb[2] = (flags_send1 0) 0xff = 1111 1111;
sb[3] = (flags_send1 8) 0xff = 0000 0001;
sb[4] = (flags_send1 16) 0xff = 0000 0000;
sb[5] = (flags_send1 24) 0xff = 0000 0000;
(2)checksum()函数
d0=(senddata 0) 0xff=0000 0001 1111 1111;
d1=(senddata 8) 0xff=0000 0001 0xff=0000 0000 0000 0001;
d2=(senddata 16) 0xff=0000 0000 0xff = 0000 0000 0000 0000;
d3=(senddata 24) 0xff=0000 0000 0xff = 0000 0000 0000 0000;
sum=0000 0010 0000 0000;
~sum=1111 1101 1111 1111;
sb[6] = (sum 0) 0xff = 1111 1111 0xff = 1111 1111 ;
sb[7] = (sum 8) 0xff = 1111 1101;
(3)
为什么定义sb[8]的前两位是0x55,0xaa?
0xaa是1010 1010,0x55是0101 0101在通讯编码原理中,应该避免过多的重复0或者1,因为当传输变成一个长0/1时,一个脉冲干扰就会将数据截断,增加误码的概率。若通讯机不能接受10101010或者01010101,那么就是线路出现问题。这是一个判断线路状态的手段。
9.串口1接收数据
(1)通过UARTRead1()函数实现
receive += (RS485_RX_BUF1[2] 0) = 0000 0000 0000 0000 0000 0000 1111 1111; ;
receive += (RS485_RX_BUF1[3] 8) = 0000 0000 0000 0000 0000 0001 1111 1111
receive += (RS485_RX_BUF1[4] 16) = 0000 0000 0000 0000 0000 0001 1111 1111
receive += (RS485_RX_BUF1[5] 24) = 0000 0000 0000 0000 0000 0001 1111 1111
(2)将receive传入checksum(u32 senddata)函数中
d0= 0000 0000 1111 1111;
d1=0000 0000 0000 0001
d2= 0000 0000 0000 0000
d3=0000 0000 0000 0000
sum=0000 0001 0000 0000
~sum = 1111 1110 1111 1111
(3)定义接收数据标记位是 u32 flags_receive1;
通过判断RS485_RX_BUF1[6] 、RS485_RX_BUF1是否等于 ((sum 0) 0xff)、((sum 8) 0xff))来判断读入的数据是不是正确的。
RS485_RX_BUF2[6] ==1111 1111
RS485_RX_BUF2[7] == 1111 1110
正确时
接收到的数据是flags_receive1 = receive= 0000 0000 0000 0000 0000 0001 1111 1111;
不正确时 flags_receive1 |= EBIT(E_ERROR); 接收数据标记位置为错误位。
1.首先用中断方式循环接收数据保存到数组
/********************************************
*串口数据接收中断服务
*功能:接收串口数据
********************************************/
void get(void) interrupt 4 using 0
{
unsigned char i;
if(RI)
{
for(i=0;i {
while(!RI);
table[i]=SBUF;
RI=0; //清标志位
}
}
}
再将用查询法数组中的数据循环发送给电脑
/********************************************
*串口数据发送
*功能:向串行口缓冲区发送n个数据
********************************************/
void send(void)
{
for(j=0;j {
SBUF=Table[i]; //将字符发送至缓冲区
while(!TI); //等待发送完成
TI=0; //清中断标志
}
}