Şu şekilde düzeldi.
MyFrame *frame = new MyFrame( NULL, -1, wxString::FromAscii("Firmata Test"), wxPoint(20,20), wxSize(400,640) );
Ama bir tane değil. Dün biraz düzeltmeye çalıştım ama liste çok uzun. Bu sayfada wxString sınıfı ile ilgili bilgiler var.
https://wiki.wxwidgets.org/WxString
Anladığım kadarıyla wxWidgets kütüphanesi ANSII kullanacak şekilde tekrar derleyince bu hata mesajları oluşmuyormuş. Bir de onu deneyeyim bakalım.
Denemek için serial (https://github.com/wjwwood/serial/) kütüphanesini kullanan bir test programı yazdım.
#include <iostream>
#include "serial/serial.h"
#include <bitset>
#include <string>
using std::cout;
using std::string;
typedef serial::Serial SeriPort;
constexpr char onaltilik[] = {'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
std::string onaltili(uint8_t * veri, int uzunluk)
{
std::string s(uzunluk * 2, ' ');
for (int i = 0; i < uzunluk; ++i)
{
s[2 * i] = onaltilik[(veri[i] & 0xF0) >> 4];
s[2 * i + 1] = onaltilik[veri[i] & 0x0F];
}
return s;
}
void baytYazdir(uint8_t bayt)
{
uint8_t *gBayt = &bayt;
cout << "Veri = " << onaltili(gBayt,sizeof(bayt)) << std::bitset<8>(bayt) << '\n';
}
std::ostream& operator<<(std::ostream& cikis, uint8_t bayt)
{
return cikis << " " << std::bitset<8>(bayt) << " " << onaltili(&bayt,sizeof(bayt)) << '\n';
}
#define START_SYSEX 0xF0 // MIDI Sysex iletisinin başlangıcı
#define END_SYSEX 0xF7 // MIDI Sysex iletisinin sonu
#define REPORT_FIRMWARE 0x79 // aygıt sürücüsü yazılımının adı ve sürümünü raporla
int main()
{
SeriPort seriPort("/dev/ttyACM0", 57600, serial::Timeout::simpleTimeout(5000));
cout << "Seri port açık mı ?\n";
if (seriPort.isOpen())
{
cout << "Evet\n";
serial::Timeout timeout = seriPort.getTimeout();
uint8_t alinan[3];
uint8_t * okunan = alinan;
seriPort.waitReadable();
for (int i = 0; i < 10; ++i)
{
seriPort.read(okunan,3);
cout << "alinan[0]" << alinan[0];
cout << "alinan[1]" << alinan[1];
cout << "alinan[2]" << alinan[2];
}
// aygıt sürücüsü yazılımı bilgilerini iste
uint8_t gonderilen[3];
gonderilen[0] = START_SYSEX; // MIDI Sysex iletisinin başlangıcı
gonderilen[1] = REPORT_FIRMWARE;// aygıt sürücüsü yazılımının adı ve sürümünü raporla
gonderilen[2] = END_SYSEX; // MIDI Sysex iletisinin sonu
cout << "gonderilen[0] " << gonderilen[0];
cout << "gonderilen[1] " << gonderilen[1];
cout << "gonderilen[2] " << gonderilen[2];
seriPort.write(gonderilen, 3);
// 13 numaralı ledi yak
gonderilen[0] = 0x91;
gonderilen[1] = 0x20;
gonderilen[2] = 0x00;
cout << "gonderilen[0] " << gonderilen[0];
cout << "gonderilen[1] " << gonderilen[1];
cout << "gonderilen[2] " << gonderilen[2];
seriPort.write(gonderilen, 3);
seriPort.close();
}
else
cout << "Hayır\n";
}
Bu program 13 numaralı ledi yakıyor. Ama dikkat ederseniz rastgele bir for döngüsüyle verileri okuyoruz. Aslında seri port üzerinde veri olduğu sürece okumaya devam et gibi bir komut kullanmak gerekiyor sanırım.
Coolterm programı (http://freeware.the-meiers.org/) ile verilere baktığınızda F0 ve F7 arasındaki verileri okumamız gerekecek.
http://www.erdem.tk/resim/CoolTerm_0%20-_050.png
Bunun içinde alınan baytları işlemek gerekecek anladığım kadarıyla. Haberleşme protokolüne (https://github.com/firmata/protocol/blob/master/protocol.md) baktığımızda komutlar 8 bit, veriler 7 bit oluyormuş.
İkili G/Ç mesajı 0x90 port LSB(bitler 0-6) MSB(bitler 7-13)
Yalnız ben bu bitlerin sıralamasını tam anlamadım. Örneğin 0x91 20 00
Burada 0x91'den sonra bitlerin sıralaması Boş 0 1 2 3 4 5 6 ve Boş 7 8 9 10 11 12 13 şeklinde mi yoksa Boş 6 5 4 3 2 1 0 ve Boş 13 12 11 10 9 8 7 şeklinde mi.
D için bu protokolü yazmayı denesek nasıl olur :-)
Ya da belki siz söylerseniz D topluluğu içinden yazmayı düşünenler çıkabilir. Ama sanırım D için bir de seri port kütüphanesi gerekecek.
Program çıktısını da buraya (http://www.erdem.tk/resim/cikti.txt) ekledim.
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]