Thread overview
onyx seri port kütüphanesini derlerken hata
Feb 06, 2016
erdem
Feb 06, 2016
erdem
February 06, 2016

https://github.com/nykytenko/onyx-serial

adresindeki kütüphaneyi kullanarak

import onyx.serial;


//module test.main;

void main()
{
       /* Create ports */
   auto port1 = OxSerialPort("/dev/ttyS1", 9600, "none", 10);
   auto port2 = OxSerialPort("/dev/ttyS2", 9600, "none", 10);


   port1.open;
   port2.open;

   ubyte[] data = [0x22, 0x33, 0xCC];

   port1.write(data);

   ubyte[] buf = port2.read(3);

   assert (buf == data);

   port1.close();
}

bu kodu derlemeye çalışıyorum. Ama bir sürü bağlayıcı hatası alıyorum.

Alıntı:

>

$ dub
Performing "debug" build using dmd for x86.
onyx-config 2.0.4: target for configuration "library" is up to date.
onyx-serial 0.3.4: target for configuration "test" is up to date.
To force a rebuild of up-to-date targets, run again with --force.
Running ./bin/onyx-serial
onyx.serial.SerialPortSetupException@std/stdio.d(3969): Can't setup serial port (Input/output error)

source/onyx/serial.d:503 core.sys.posix.termios.termios onyx.serial.PosixImpl.getTermios() [0x80d01ef]
source/onyx/serial.d:473 void onyx.serial.PosixImpl.setFlags() [0x80d010f]
source/onyx/serial.d:406 void onyx.serial.PosixImpl.setup() [0x80cfed1]
source/onyx/serial.d:196 bool onyx.serial.OxSerialPort.open() [0x80cf8a7]
test/main.d:14 _Dmain [0x80d793f]
??:? _D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZ9__lambda1MFZv [0x80e6f72]
??:? void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])).tryExec(scope void delegate()) [0x80e6ed5]
??:? void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])
).runAll() [0x80e6f2e]
??:? void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate()) [0x80e6ed5]
??:? _d_run_main [0x80e6e5e]
??:? main [0x80d7a53]
??:? __libc_start_main [0x7cc4d2]
Program exited with code 1

Acaba neden olabilir?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 06, 2016

Evet haklısınız gerçekten de çalışıyormuş.

Şimdi şöyle bir örnek yapmaya çalışıyorum. Seri porta bir tane Arduino bağlı. Karşı tarafta da başka bir devre RF sinyalleri ile hava sıcaklığı ve nem bilgilerini kablosuz olarak iletiyor. Bilgisayara bağlı devre de bu verileri okuyor ve seri porta gönderiyor.

Screen programı ile bu verileri ekrana şu şekilde yazabiliyorum.

'$ screen /dev/ttyACM0 9600'

Alıntı:

>

22.1942.20
22.1942.08
22.1642.13
22.1642.01
22.1642.01
22.1941.84
22.1941.72
22.0941.81

Programı da şu şekilde değiştirdim.

import onyx.serial;
import std.stdio;

void main()
{

   auto port1 = OxSerialPort("/dev/ttyACM0", 9600, "none", 10000);

   port1.open;

   ubyte[] veriler = port1.read(90,true);

   foreach(veri; veriler)
       write(cast(char)veri);
   writeln();

   port1.close();

}

Programın çıktısı da şu şekilde:

Alıntı:

>

23
22.1941.60
22.1641.34
22.1641.34

Ama aralarında şöyle bir fark var. Screen programını çalıştırdığınızda bekliyor veri geldikçe ekrana yazıyor.

Yukardaki örnek program ise 90 byte okuyor. Bekliyor. En sona verileri yazıyor.

Acaba yukarıdaki programı da seri porta veri geldikçe yazacak şekilde nasıl değiştirebilirdik.

22.1942.20 şeklinde bir veri geldi ekrana yazsın. Sonra beklesin gibi.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 06, 2016

Bence bağlayıcı ile ilgili değil. Program oluşuyor ve 'Running ./bin/onyx-serial' satırında görüldüğü gibi işletiliyor bile... (Bu arada, dub oluşturduğu programı neden işletiyor acaba?)

Asıl sorun, tcgetattr() işlevi istendiği gibi çalışmıyor:

https://github.com/nykytenko/onyx-serial/blob/master/source/onyx/serial.d#L501

Bilmiyorum neden. Erişim hakkı filan mı?

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 06, 2016

Birisi benzerini sormuş:

http://stackoverflow.com/questions/7035526/read-serial-data-without-high-cpu-use

Oradan öğrendiğime göre Posix'te poll.h ve Linux'ta ek olarak epoll.h varmış. Bunların D ilintileri de var:

</usr/include/dmd/druntime.2.0.67/import/core/sys/posix/poll.d>
</usr/include/dmd/druntime.2.0.67/import/core/sys/linux/epoll.d>

Bundan ötesini bilmiyorum. Kolay gelsin. ;)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]