วันพุธที่ 28 ธันวาคม พ.ศ. 2559

qt serial non-standard baudrate example, custom speed example ตัวอย่าง

เวลาที่เราต้องการใช้ serial port และ ใช้ baudrate ไม่มาตรฐาน ( custom baudrate, custom speed, non-standard baurate, non-standard speed ) ถ้าเป็นเครื่อง pc ทั่วไป ที่มี comport ติดมากับ mainboard ก็สามารถใช้ library ที่ Qt มีมาให้ได้ทันที แต่พอเป็น usb serial ต้องใช้วิธีเขียนอีกแบบนึง จึงจะสามารถใช้งาน custom speed ได้

กว่าจะหาวิธีที่ทำให้ rpi + qt + usb serial สามารถสื่อสารโดย custom speed  ได้ ค่อนข้างลำบาก (ข้อมูลค่อนข้างน้อย ใน google) ต้องรวบรวมข้อมูลจากหลายๆที่ แล้วมาทดลองทำดู ถึงจะได้ออกมา

ผู้เขียนเลือกใช้ usb serial ยี่ห้อ z-tek เวลาไปซื้อต้องบอกเจ้าของร้านว่าเอาของจริงเท่านั้น เพราะถ้าซื้อของปลอมมา จะใช้ไม่ได้ (ของปลอมทำเลียนแบบมีเยอะมาก และ ราคาก็ถูกกว่า) หรือถ้าใครมีความสามารถผลิต usb serial เองได้ โดยใช้ chipset ftdi ก็สามารถนำมาใช้ได้เหมือนกัน

มาดูตัวอย่าง code กันดีกว่า

#include <linux/serial.h>
#include <asm/termios.h>
#include <asm/ioctls.h>
#include <asm/termbits.h>
#include <stropts.h>
#include <QThread>

#include <fcntl.h>    /* For O_RDWR */
#include <unistd.h>   /* For open(), creat() */



main(){
int fd;
fd = open("/dev/ttyUSB0",O_RDWR|O_NOCTTY);


struct termios2 tio;
ioctl(fd, TCGETS2, &tio);
tio.c_cflag &= ~CBAUD;
tio.c_cflag |= BOTHER;
tio.c_ispeed = ความเร็วที่ต้องการ;
tio.c_ospeed = ความเร็วที่ต้องการ;
tio.c_cflag |= PARENB; // even parity
tio.c_cflag &= ~CSTOPB; // 1 stop bit
tio.c_cflag &= ~CSIZE;
tio.c_cflag |= CS8;

tio.c_cc[VTIME]=10; // wait 10 deciseconds

tio.c_cc[VMIN]=0;
ioctl(fd, TCGETS2, &tio);

========================================

พอมาทำกับ rpi4 แล้วใช้ไม่ได้ จึงเปลี่ยนเป็นแบบนี้

    struct termios2 tio;
    ioctl(fd, TCGETS2, &tio);
    tio.c_cflag &= ~CBAUD;
    tio.c_cflag |= BOTHER;
    tio.c_ispeed = 5760;
    tio.c_ospeed = 5760;
    tio.c_cflag |= PARENB; // even parity
    ioctl(fd, TCSETS2, &tio);
========================================
char ping_cmd[] = {2,1};
char ping_rec[7];
write(fd, &ping_cmd, sizeof(ping_cmd) );
QThread::msleep(1000);
read(fd, &ping_rec, sizeof(ping_rec));
write(fd, &ping_rec, sizeof(ping_rec) );
}

เมื่อ compile ผ่านแล้ว เราก็ต่อสายสัญญาณ USB232 จาก rpi เข้ากับ RS232 ของ notebook โดยไขว้ขา 2 กับ 3 สลับกันไว้
แล้วก็เปิดโปรแกรมอะไรก็ได้ที่สามารถสื่อสารผ่าน comport ได้
ในที่นี้ผู้เขียนได้ตั้งโปรแกรม comport ที่เครื่อง notebook ไว้ว่า ถ้ามี 0x01 ผ่านเข้ามา ให้ส่ง 0x61 ออกไป ก็จะได้ผลดังรูปด้านล่าง


จอบอ

ที่มา
http://stackoverflow.com/questions/12646324/how-to-set-a-custom-baud-rate-on-linux

https://blog.mbedded.ninja/programming/operating-systems/linux/linux-serial-ports-using-c-cpp/





วันพุธที่ 21 ธันวาคม พ.ศ. 2559

qt checkbox ตัวอย่าง

เริ่มจากการลาก GroupBox มาวางไว้ก่อน

แล้วลาก checkbox ลงมา สามารถลากลงมาได้หลายอัน ตามต้องการ โดยวางให้อยู่ใน GroupBox

เวลาเขียน code ก็พิมพ์ตามนี้

if(ui->radioButton->ischeck())
{
  QmessageBox::infomation(0,"message1","message2");
}

โดย message1 คือ title ที่อยู่ข้างบน bar
และ message2 คือ ข้อความที่ต้องการโชว์

ที่มา
https://www.youtube.com/watch?v=0XuxnBqGpWI

qt เปิด window ใหม่, เปิดหน้าต่างใหม่

ถ้าเราต้องการเปิดหน้าต่างใหม่ โดยใช้การกดปุ่ม ให้ทำดังนี้
1. คลิกขวาที่โปรเจค กด add new

ฝั่งซ้าย เลือก qt , ฝั่งขวาเลือก qt designer from class แล้วกด choose


แล้วตั้งชื่อหน้าต่างใหม่ตามต้องการ ในที่นี้ตั้งชื่อว่า SecDialog
จะมีหน้าต่างใหม่ขึ้นมา กด Diaglog without button กด next



2. ใน mainwindow.cpp ให้เพิ่ม #include "SecDialog.h"
3. ไปที่ mainwindow.h เพิ่ม #include "SecDialog.h"
4. mainwindow.h ตรง private: ให้เพิ่ม SecDialog *secdialog;
5. แล้วก็ไปที่ mianwindow.ui ให้คลิกขวาที่ปุ่มที่ต้องการให้เปิดหน้าต่างใหม่ เลือกไปที่ go to slot, click() แล้วพิมพ์ดังนี้
secdialog = new SecDialog(this);
secdialog-> show();

จบ
ที่มา https://www.youtube.com/watch?v=tP70B-pdTH0

qt วาดภาพ ตัวอย่าง

เนื่องจากใน qt ไม่ได้มีเครื่องมืออำนวยความสะดวกในการวาดภาพเหมือนโปรแกรม mspaint
เราจึงต้องเขียน code เพื่อวาดภาพเอง

ทำดังนี้

1. ใน main.h ให้เพิ่ม code เข้าไปใน class
protected:
  void paintEvent(QPaintEvent *e);


2. ใน mainwindow.cpp ให้เพิ่ม #include <QtGui>
และเพิ่มฟังก์ชัน
void mainwindow::paintEvent(QPaintEvent *e)
{
  QPainter p;
  p.begin(this);
  p.drawrect(0,0,50,50);
  หรืออยากวาดอะไรก็วาดไปได้เลย
}

ที่มา
https://www.youtube.com/watch?v=xXV3_mktCmY

วันอาทิตย์ที่ 18 ธันวาคม พ.ศ. 2559

qt sleep ตัวอย่าง

#include <QThread>

และตอนใช้ ก็ใช้แบบนี้

QThread::sleep(xx); โดย xx คือ ตัวเลข ในหน่วยวินาที

หรือ

QThread::msleep(xx); โดย xx คือ ตัวเลข ในหน่วยมิลลิวินาที 1,000 มิลลิวินาที = 1 วินาที

หรือ

QThread::usleep(xx); โดย xx คือ ตัวเลข ในหน่วยไมโครวินาที 1,000,000 มิลลิวินาที = 1 วินาที