В настоящее время я делаю модуль apache для linux, и цель состоит в том, чтобы передавать правильные данные в / из последовательного порта (rs232) на основе пользовательского ввода.
Здесь я попробовал простую программу.
Если я создаю простой пустой файл и предоставляю ему полные права доступа (через chmod 777), и я использую это имя файла вместо / dev / ttyS0 в моем коде, то правильные данные записываются и загружаются изфайл и процесс происходит быстро, как и ожидалось, из моего браузера.
Теперь я попытался изменить это имя файла обратно на / dev / ttyS0, потому что я хочу записывать и читать с последовательного порта.Поскольку этот файл был символической ссылкой на / dev / tts / 0, я изменил разрешения обоих файлов на 777. На этот раз браузер зависает, как будто ничего не происходит.
Затем я использовал stty, чтобы изменить настройки дляпорт, чтобы я мог остановить чтение или запись по истечении времени ожидания.Теперь мои настройки следующие:
bash-3.1# stty -F /dev/ttyS0 -a
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>;
start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 10;
-parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl -ixon -ixoff -iuclc -ixany -imaxbel
-iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
Это код, который я создал:
<code>#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"
#include "ap_config.h"
static int ainp(const char* port,char* dat,request_rec *r){
//make memory pool so file handler has memory to work with
apr_pool_t* apool;
apr_status_t ps=apr_pool_create_ex(&apool,NULL,NULL,NULL);
//open binary file for reading
apr_file_t* fd;
apr_status_t fs=apr_file_open(&fd,port,APR_FOPEN_READ | APR_FOPEN_BINARY, APR_OS_DEFAULT, apool);
if (fs != APR_SUCCESS){ap_rprintf(r,"cant open %s for write<br>",port);}
//Read in up to 10 bytes of data
char* dp=dat;
apr_size_t sz=10;
apr_status_t fsr=apr_file_read(fd,dp,&sz);
//Close file
apr_status_t fsc=apr_file_close(fd);
//And strip string output to not receive garbage
dat[sz]='\0';
}
static int aoutp(const char* port,char* dat,request_rec *r){
apr_pool_t* apool;
apr_status_t ps=apr_pool_create_ex(&apool,NULL,NULL,NULL);
apr_file_t* fd;
apr_status_t fs=apr_file_open(&fd,port,APR_FOPEN_WRITE | APR_FOPEN_BINARY, APR_OS_DEFAULT, apool);
if (fs != APR_SUCCESS){ap_rprintf(r,"cant open %s for read<br>",port);}
char* dp=dat;
apr_size_t sz=10;
apr_status_t fsr=apr_file_write(fd,dp,&sz);
apr_status_t fsc=apr_file_close(fd);
}
static int centralstation_handler(request_rec *r)
{
char dat[20]; //My data
if (strcmp(r->handler, "centralstation")){return DECLINED;}
r->content_type = "text/html";
if (!r->header_only)
{
//Stall starts here
aoutp("/dev/ttyS0","1234567890ABCDEFGHIJ",r);
ainp("/dev/ttyS0",dat,r);
ap_rprintf(r,"Data: <pre>%s
", dat);} return OK;} static void centralstation_register_hooks (apr_pool_t * p) {ap_hook_handler (centralstation_handler, NULL, NULL, APR_HOOK_MIDDLE;NULL, / * создание структур конфигурации на сервер * / NULL, / * объединение структур конфигурации на сервер * / NULL, / * таблица команд файла конфигурации * / centralstation_register_hooks / * перехват регистрации * /};
Что я могу сделать, чтобы удалить эту стойку, все еще пытаясь получить доступ к последовательному порту? Я ожидаю, что функция open вернется немедленно или по крайней мере через 10 секунд? Я использую неправильные функции?