2010-07-14 58 views
0

我使用直接連接到使用該方案的PC並行端口pc1602f PowerTip: http://www.beyondlogic.org/parlcd/parlcd.htm編程232到LCD(Linux)的

所有以及激勵LCD,顯示我有黑色塊的前排,直到那時好,但現在我想通過並行端口發送信息。

如果你看一下頁面,你會看到,有將信息發送到LCD的來源,但使用Windows庫:呵呵:

我離開我的代碼試圖成爲Linux操作系統。

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <termios.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/io.h> 
#define PORTADDRESS 0x3f8 
#define DATA PORTADDRESS+0 
#define STATUS PORTADDRESS+1 
#define CONTROL PORTADDRESS+2 

main(int argc, char **argv) 
{char string[] = {"Testing 1,2,3"}; 

    int count; 
    int len; 

    char init[10]; 
    init[0] = 0x0F; /* Init Display */ 
    init[1] = 0x01; /* Clear Display */ 
    init[2] = 0x38; /* Dual Line/8 Bits */ 

    if (ioperm(PORTADDRESS,1,1)) 
     fprintf(stderr, "No se puede acceder al: %x\n", PORTADDRESS), exit(1); 

    outb(CONTROL, inb(CONTROL) & 0xDF); 
    outb(CONTROL, inb(CONTROL) & 0x08); 


    for (count = 0; count <= 2; count++) 
    { 

     outb(DATA, init[count]); 
     outb(CONTROL,inb(CONTROL) | 0x01); 
     sleep(20);         
     outb(CONTROL,inb(CONTROL) & 0xFE); 
     sleep(20);         
    } 
    outb(CONTROL, inb(CONTROL) & 0xF7); 

    len = strlen(string); 

    for (count = 0; count < len; count++) 
    { 
     outb(DATA, string[count]); 
     outb(CONTROL,inb(CONTROL) | 0x01); 
     sleep(2); 
     outb(CONTROL,inb(CONTROL) & 0xFE); 
     sleep(2); 
    } 

} 

完全編譯,但是當我想嘗試,因爲根目錄並運行它拋出我

[email protected]: /

media/E80C-30D5/LCD/build #./lcd

Segmentation fault (`core 'generated)

[email protected]: /media/E80C-30D5/LCD/build #

看着dmesg的我發現這一點。

[3176.691837] lcd [3867] general protection ip: 400cb4 sp: 7fff887ad290 error: 0 in lcd [+2000 400 000][email protected]:/media/E80C-30D5/LCD/build #

我把TTYS的dmesg的日誌*

root @ ubuntu:/media/E80C-30D5/LCD/build # dmesg | grep ttyS 
[2.335717] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A 
[2.335817] serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A 
[2.336100] 00:0 b: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A 
[2.336207] 00:0 c: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A 
root @ ubuntu:/media/E80C-30D5/LCD/build # 

不要讓它跑,你能幫助我嗎?

回答

0

我同意其他人的意見,如果可能,我應該寫信給相應的設備文件,而不是直接執行I/O。

然而,爲了完整起見:

ioperm(PORTADDRESS,1,1) 

應該

ioperm(PORTADDRESS,4,1) 

此外,使用括號避免錯誤是不正確的宏觀擴張的結果,這樣的:

#define PORTADDRESS (0x3f8) 
#define DATA  (PORTADDRESS+0) 
#define STATUS  (PORTADDRESS+1) 
#define CONTROL  (PORTADDRESS+2) 
+0

這一口井必須設計一個模塊才能使其工作或有可能完全激活端口的不同位? – Backglass 2010-07-14 13:33:44

+0

也許有人已經寫了一個驅動程序。看看http://lcd-linux.sourceforge.net/是否有用。另外,我的建議是否解決了您的問題? – Artelius 2010-07-14 13:50:59

1

您嘗試運行的代碼不會在「現代」操作系統中運行。 Linux和16位版本的Windows不允許您執行直接訪問端口或內存的操作。訪問內存需要經過一個內存管理器,所以你指定的地址並不是你最終訪問的地址;而端口只能由作爲操作系統內核一部分的設備驅動程序訪問。

我不是很確定,但是如果你的主要目的只是通過串口輸出一些字節,那麼你的大部分代碼是不必要的,因爲你可以簡單地寫一個包裝設備驅動程序的文件港口。這個in this article有一些更詳細的信息。

如果您確實需要在串口芯片上進行一些操作,您可以在此serial port mini-howto的最後一行中找到更多信息。被警告說編寫你自己的設備驅動程序被認爲是高級的。


編輯:我只注意到你的問題中提到的並行端口,但在你的代碼(3F8)的端口號是串行端口。提示:如果您要連接的插頭是9針端口,那麼它絕對是一個串口。如果它是一個25針的端口和母(孔,而不是針),那麼它可能是一個並行端口,如果是男性,它可能是一個串口。或者你可以測量電壓:串口信號上升到+/- 9V左右,而並行端口信號從0到5V。

0

而不是寫入到地址空間以外的地址(這會使其僅在PC上運行),只需寫入文件(/dev/lp0或其他位置)即可。
您的液晶顯示器似乎在串口通訊,爲什麼不使用串口呢?然後你的程序會寫入/dev/ttyS0或類似的東西。

+0

對不起。你的液晶顯示器看起來不像串口。我對你的問題感到困惑。 – MattBianco 2010-07-14 13:29:01

+0

uhm,如果不是作爲LCD設備的內核模塊設計開始,或者設計一個以鬆動位形式發送的代碼,則以十六進制形式發送字 – Backglass 2010-07-14 13:40:57