下面是c语言select版本监听socket和一个串口,看起来是那么的熟悉。
int create_socket(void)
{
fd_set readfd; //读文件描述符集合
int ret;
STRU_MSG_HEAD msg_head;
int len;
char buf[SIZE]; //接收网络数据缓冲区6K
memset(&server_addr, 0, sizeof(server_addr));
/* 初始化网络信息*/
server_addr.sin_family = AF_INET; //设置为IP通信
server_addr.sin_addr.s_addr = INADDR_ANY; //无限制
server_addr.sin_port = htons(8000);
if ((server_sockfd = socket(PF_INET,SOCK_DGRAM,0)) < 0) {
ERROR("socket error\n");
return -1;
}
if(bind(server_sockfd, (struct sockaddr *)&server_addr,
sizeof(struct sockaddr)) < 0) {
ERROR("bind error\n");
return -1;
}
sin_size = sizeof(struct sockaddr_in);
for(;;) {
/* 接收消息*/
bzero(buf, SIZE);
FD_ZERO(&readfd);
FD_SET(zigbeefd, &readfd);
FD_SET(server_sockfd, &readfd);
ret = select(server_sockfd + 1, &readfd, NULL, NULL, NULL);
if (ret == -1)
perror("select:");
else if (ret == 0)
printf("timeout.\n");
else if (FD_ISSET(zigbeefd, &readfd)) {
printf("have a uart data...........\n");
if (read(zigbeefd, buf, SIZE) < 0) {
ERROR("read zigbee error\n");
continue;
}
} else if (FD_ISSET(server_sockfd, &readfd)) {
printf("have a net data...........\n");
if((len = recvfrom(server_sockfd, buf, SIZE, 0,
(struct sockaddr*)&client_addr, &sin_size)) < 0) {
ERROR("receive packet error\n");
continue;
}
}
/* 消息处理
* 解析消息头
* 分发消息
* */
memcpy(&msg_head, buf, sizeof(msg_head));
switch(msg_head.u16MsgType) {
/* 查看系统信息请求*/
case O_MCMMAIN_MACHINE_INFO_QUERY_REQ:
get_machine_info_req(buf);
break;
/* 设置寄存器请求*/
case O_MCMMAIN_SET_REGISTER_DATA_REQ:
set_register_data_req(buf);
break;
/* 查询寄存器请求*/
case O_MCMMAIN_GET_REGISTER_DATA_REQ:
get_register_data_req(buf);
break;
/* 设置EEPROM请求*/
case O_MCMMAIN_SET_EEPROM_DATA_REQ:
set_eeprom_data_req(buf);
break;
/* 查询EEPROM请求*/
case O_MCMMAIN_GET_EEPROM_DATA_REQ:
get_eeprom_data_req(buf);
break;
/* 软件更新请求 */
case O_MCMMAIN_SOFTWARE_UPDATE_REQ:
software_update_req(buf);
break;
/* 发送短信息请求*/
case O_MCMMAIN_MODEM_REQ:
send_gprs_message_req(buf);
break;
/* 发送ZIGBEE信息请求*/
case O_MCMMAIN_ZIGBEE_REQ:
send_zigbee_message_req(buf);
break;
/* 报警器控制*/
case O_MCMMAIN_BEEP_REQ:
beep_control_req(buf);
break;
/* LED控制*/
case O_MCMMAIN_LED_REQ:
led_control_req(buf);
break;
/* 硬件自检*/
case O_MCMMAIN_HARDWARE_SELFTEST_REQ:
hardware_selftest_req(buf);
break;
/* 时间校准*/
case O_MCMMAIN_TOD_ADJUST_REQ:
time_adjust_req(buf);
break;
/* TODO: 查询软件版本*/
case O_MCMMAIN_VERSION_QUERY_REQ:
/* TODO:*/
break;
} //end switch
}//end for(;;)
} //end
好用的PHP版本
count = 1;
//三次握手之后
$file = "";
$_read=array();
$tcp_worker::$stdoutFile = 'echodata.log';
$tcp_worker->onWorkerStart = function()
{
global $file;
$file = fopen( "/dev/ttyS1", "r+" );
if( $file == false )
{
echo ( "Error in opening new file" );
}
else
{
fwrite($file, "This is a simple test");
stream_set_blocking($file,false);
stream_set_read_buffer($file, 0);
//chmod("/dev/ttyS1",0777);
Worker::$globalEvent->add($file, EventInterface::EV_READ, function($file)
{
$time_t = date("Y/m/d H:i:s");
$buffer = fread($file,1024);
if ($buffer === '' || $buffer === false)
{
echo("read error\r\n");
}
else
{
echo ($time_t."\r\n".$buffer);
fwrite($file, $time_t."\r\n".$buffer);
}
//$connection->send($time_t.$buffer);
});
}
/* Timer::add(2, function()use($_read)
{
$time_t = date("Y/m/d H:i:s");
echo($time_t."come\r\n");
$write = $except = null;
stream_select($_read,$write,$except,1);
foreach($_read as $fd)
{
$buffer = fread($fd,65535);
if ($buffer === '' || $buffer === false)
{
echo("read error\r\n");
continue;
}
//$connection->send($time_t.$buffer);
echo ($time_t.$buffer);
}
}); */
};
$tcp_worker->onConnect = function($connection)
{
$time_t = date("Y/m/d H:i:s");
echo $time_t.":new connection from ip " . $connection->getRemoteIp() . "\n";
$connection->send('hello world');
};
// 当客户端发来数据时
$tcp_worker->onMessage = function($connection, $message)
{
$time_t = date("Y/m/d H:i:s :");
//$connection->send($time_t.$message);
//$connection->close();
echo ($time_t.$message."\r\n");
global $file;
if( $file == false )
{
echo ( "Error in opening new file" );
}
else
{
fwrite($file, $message);
}
};
$tcp_worker->onClose = function($connection)
{
$time_t = date("Y/m/d H:i:s");
echo $time_t.":".$connection->getRemoteIp().":".$connection->getRemotePort()." closed\n";
};
// 运行worker
Worker::runAll();
看起来多简洁,windows版本,1024个句柄,linux大得很。io复用可以达到极致。目前未解决的问题,串口接收数据必须要有结束符,然后接收到的数据会发送出去。
目前已经解决 ,system("stty -F /dev/ttyS1 ispeed 115200 ospeed 115200 cs8 -echo cbreak");
-echo 关闭回显,cbreak立即响应。
注:平时read时,要回车结束输入,而当开启输入立即响应模式时,输入之后立即响应
linux 平台nano pi H3 M1;