2010年4月12日 星期一

在Android下建立RS232通訊應用程式心得分享


利用Android來設計硬體平台時,若您的驅動不是自己開發,而是拿廠商的軟體,在檔案放置的位置上要特別小心,在圖上有兩個檔案是由長高科技提供,所以當您在建立新專案時,請注意其目錄放置位置。以上是所撰寫的原始程式列表(粗體字的部份是長高所撰寫的JNI函式):
package com.example.uart;

import tw.com.dmatek.dma6410xp.uart.Linuxc;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;


public class Uart_Control extends Activity {
/** Called when the activity is first created. */
public int fd=-1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button uart1 = (Button) findViewById(R.id.uart1);
uart1.setOnClickListener(new OnClickListener(){


@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(fd > 0) Linuxc.closeUart(0);
fd=Linuxc.openUart(1);
if(fd>0)
{
setTitle("open uart1 sucess!"+String.valueOf(fd));
Linuxc.setUart(0);//1200bps
}
else
{
setTitle("open device false!"+fd);
}
}

});
Button uart2 = (Button) findViewById(R.id.uart2);
uart2.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(fd > 0) Linuxc.closeUart(0);
fd=Linuxc.openUart(2);
if(fd>0)
{
setTitle("open uart2 sucess!"+String.valueOf(fd));
Linuxc.setUart(0);//1200bps
}
else
{
setTitle("open device false!"+fd);
}

}

});
Button send = (Button) findViewById(R.id.send);
send.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Linuxc.sendMsgUart("123"); }

});
final TextView tv = (TextView) findViewById(R.id.TextView01);
Button receive = (Button) findViewById(R.id.recevice);
receive.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String str = Linuxc.receiveMsgUart();
tv.setText(str);
}

});
}
}

8 則留言:

  1. 版主可不可以發一下Uart 的JNI 程式, 小弟想學習UART JNI的接收方法,感激不儘.

    回覆刪除
  2. Uart 的JNI 程式

    #include
    #include
    #include
    #include
    #include
    #include "tw_com_dmatek_dma6410xp_uart_Linuxc.h"
    #include
    #include
    #include
    #include
    #include


    #include
    #undef TCSAFLUSH
    #define TCSAFLUSH TCSETSF
    #ifndef _TERMIOS_H_
    #define _TERMIOS_H_
    #endif

    int fd;

    JNIEXPORT jint JNICALL Java_tw_com_dmatek_dma6410xp_uart_Linuxc_openUart(JNIEnv *env,jclass mc,jint i)
    {
    if(i==1)
    {
    fd=open("/dev/ttySAC1",O_RDWR|O_NOCTTY|O_NDELAY);
    return fd;
    }
    else if(i==2)
    {
    fd=open("/dev/ttySAC2",O_RDWR|O_NOCTTY|O_NDELAY);
    return fd;
    }
    else if(i==3)
    {
    fd=open("/dev/ttySAC3",O_RDWR|O_NOCTTY|O_NDELAY);
    return fd;
    }
    return fd;
    }

    JNIEXPORT void JNICALL Java_tw_com_dmatek_dma6410xp_uart_Linuxc_closeUart(JNIEnv *env,jclass mc,jint i)
    {
    close(fd);
    }

    JNIEXPORT jint JNICALL Java_tw_com_dmatek_dma6410xp_uart_Linuxc_setUart(JNIEnv *env,jclass mc)
    {

    }

    JNIEXPORT jint JNICALL Java_tw_com_dmatek_dma6410xp_uart_Linuxc_sendMsgUart(JNIEnv *env,jclass mc,jstring str)
    {
    int len;
    const char *buf;
    char buffer[255];
    char buff[255];
    buf=(*env)->GetStringUTFChars(env,str,NULL);

    len= (*env)->GetStringLength(env,str );

    int fd_max = fd + 1;
    int n,i=0,p;
    memset(buffer, 0, sizeof(buffer));
    memset(buff, 0, sizeof(buff));
    for(n=0;n='A'||buffer[p]<='z'&&buffer[p]>='a'||buffer[p]<='9'&&buffer[p]>='0')
    {
    buff[i]=buffer[p];
    i++;
    }
    }
    write(fd,buff,len);
    }

    JNIEXPORT jstring JNICALL Java_tw_com_dmatek_dma6410xp_uart_Linuxc_receiveMsgUart(JNIEnv *env,jclass mc)
    {

    }

    回覆刪除
  3. 貴社群的老師您們好,我是貴社群的讀者,請問一下各位老師,android透過jni的方式載入so檔做rs232的應用方面,我手邊有mini2440與Beagleboard xM這兩種開發板,而我按照此篇方法均無法在開發板正常使用,後來查了一下網路其他解決方式,有的文章說要使用mm編譯出apk,有的說要在AndroidManifest.xml 加上權限設置Shared user id = "android.uid.system"使uid=1000之後以logcat查看,uid已經1000了,但程式所屬使用者是system而非root,有的說要使用Eclipse輸出未簽章過的apk在用簽名工具把平台簽名檔對apk進行簽名,以上的方法均試過還是無法執行長高DMA6410開發書中光碟的RS232應用範例,可以請問一下老師指點迷津為何還是無法執行的可能原因嗎?謝謝老師

    回覆刪除
  4. 問題可能出現在RS232驅動程式上,長高的範例是使用長高自己設計的.ko檔, 建議您把您板上的RS232驅動程式載入, 然後再改寫長高附上的.so的原始程式, 這樣應該可以。

    回覆刪除
  5. 對了記得把so檔重新改寫並編譯

    回覆刪除
  6. TO:chihhao
    有收到您的來信,在我回在這邊。
    1.關於PL2303 USB TO RS232部分,我的建議是直接編譯Kernel比較快:
    Make menuconfig:
    Device Drivers --->
    USB support --->
    USB Serial Converter support --->
    <*> USB Prolific 2303 Single Port Serial Driver
    存檔離開後直接執行make編譯。

    2.您要確認/dev目錄下是否有ttyUSBx的檔名,如果沒有的話代表您的驅動沒上去,如果有的話按照作業系統這門課所教把該裝置當作檔案讀寫應該就可以了,你可以先試試看。

    回覆刪除
  7. Hello sir
    can u please post entire code some where so that we can download and test on board.
    if possible a copy to my email -id : watisid@rediffmail.com

    回覆刪除
  8. see http://cheng-min-i-taiwan.blogspot.com/2012/01/android-rs232-androidrs232.html

    回覆刪除