2011年12月19日 星期一

[Linux] Writing to serial port

目的:
寫一個傳送data到serial port code

CODE:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <memory.h>

#define BAUDRATE B115200 /* 鮑率設定被定義在 <asm/termbits.h>, 這在 <termios.h> 被引入 */
#define MODEMDEVICE "/dev/ttyUSB0" /* 定義正確的序列埠 */
#define _POSIX_SOURCE 1 /* POSIX 系統相容 */
#define STOP '@'

int main()
{
    int fd, c=0, res;
    struct termios oldtio, newtio;
    char ch;
    char s1[8];
    int data[7];
    printf("Start...\n");
/*
開啟數據機裝置以讀取並寫入而不以控制 tty 的模式
因為我們不想程式在送出 CTRL-C 後就被殺掉.
*/
    printf("start Open port...\n");
    fd = open(MODEMDEVICE,  O_RDWR | O_NOCTTY);
    if (fd < 0)
    {
         perror(MODEMDEVICE);
         return 1;
    }   

    tcgetattr(fd, &oldtio); /* 儲存目前的序列埠設定 */
    memset(&newtio,0, sizeof(newtio)); /* 清除結構體以放入新的序列埠設定值 */
/*
BAUDRATE: 設定 bps 的速度. 你也可以用 cfsetispeed 及 cfsetospeed 來設定.
CRTSCTS : 輸出資料的硬體流量控制 (只能在具完整線路的纜線下工作
參考 Serial-HOWTO 第七節)
CS8     : 8n1 (8 位元, 不做同位元檢查,1 個終止位元)
CLOCAL  : 本地連線, 不具數據機控制功能
CREAD   : 致能接收字元
IGNPAR  : 忽略經同位元檢查後, 錯誤的位元組
ICRNL   : 比 CR 對應成 NL (否則當輸入訊號有 CR 時不會終止輸入)
在不然把裝置設定成 raw 模式(沒有其它的輸入處理)
*/
    newtio.c_cflag = BAUDRATE|CS8|CLOCAL|CREAD;
    newtio.c_iflag = IGNPAR;
/*
Raw 模式輸出.
*/
    newtio.c_oflag = 0;
/*
ICANON  : 致能標準輸入, 使所有回應機能停用, 並不送出信號以叫用程式
*/
    newtio.c_lflag = ICANON;
/*
現在清除數據機線並啟動序列埠的設定
*/
    tcflush(fd, TCIFLUSH);
    tcsetattr(fd, TCSANOW, &newtio);
    printf("Writing...\n");
 
    {
    s1[0]=0xC0;
    s1[1]=0x63;
    s1[2]=0x07;
    s1[3]=0x0A;
    s1[4]=0x00;
    s1[5]=0x00;
    s1[6]=0xAE;
    res = write(fd, &s1, 7);
    }
    printf("Close...\n");
    close(fd);
/* 回存舊的序列埠設定值 */
    tcsetattr(fd, TCSANOW, &oldtio);
    return 0;
}


此程式參考文章

沒有留言:

張貼留言