|
串口通信
发表于 2016-8-17 08:27:20
浏览:6663
|
回复:0
打印
只看该作者
[复制链接]
楼主
我仿android-serial-api做的串口通信APP,对ttyS0~3进行读写操作发现并不能对ttyS0~3存取数据。
jni的代码- JNIEXPORT jobject JNICALL Java_com_example_liangzhanpeng_urat_SerialPort_open
- (JNIEnv *env, jclass thiz, jstring path, jint baudrate){
- int fd;
- speed_t speed;
- jclass mFileDescriptor;
- {
- speed = getBaudrate(baudrate);
- if (speed == -1){
- LOGE("invalid baudrate");
- return NULL;
- }
- }
- {
- jboolean iscopy;
- const char *path_utf = (*env)->GetStringUTFChars(env, path, &iscopy);
- LOGE("OPENING SERIAL PORT %s",path_utf);
- fd = open(path_utf,O_RDWR | O_NOCTTY | O_NONBLOCK | O_NDELAY);
- LOGD("open() fd = %d", fd);
- (*env)->ReleaseStringUTFChars(env,path,path_utf);
- if(fd == -1)
- {
- LOGE("cannot open port");
- return NULL;
- }
- }
- {
- struct termios cfg;
- LOGD("Configuring serial port");
- if(tcgetattr(fd,&cfg))
- {
- LOGE("tcgetattr() failed");
- close(fd);
- return NULL;
- }
- cfmakeraw(&cfg);
- cfsetispeed(&cfg,speed);
- cfsetospeed(&cfg,speed);
- if(tcsetattr(fd,TCSANOW,&cfg))
- {
- LOGE("tcsetattr() failed");
- close(fd);
- return NULL;
- }
- }
- {
- jclass cFileDescriptor = (*env)->FindClass(env, "java/io/FileDescriptor");
- jmethodID iFileDescriptor = (*env)->GetMethodID(env, cFileDescriptor, "<init>", "()V");
- jfieldID descriptorID = (*env)->GetFieldID(env, cFileDescriptor, "descriptor", "I");
- mFileDescriptor = (*env)->NewObject(env, cFileDescriptor, iFileDescriptor);
- (*env)->SetIntField(env, mFileDescriptor, descriptorID, (jint)fd);
- }
- return mFileDescriptor;
- }
复制代码
串口操作代码为- private FileDescriptor mfd;
- private FileInputStream mFileInputStream;
- private FileOutputStream outputStreaml;
- public SerialPort(File device,int baudrate) throws SecurityException,IOException{
- if (!device.canRead() || !device.canWrite()){
- try{
- Process su;
- su = Runtime.getRuntime().exec("/system/xbin/su");
- Log.i(TAG, "SerialPort: "+su.toString());
- String cmd = "chmod 777 " + device.getAbsolutePath() + "\n" + "exit\n";
- Log.i(TAG, "SerialPort: " + cmd.toString());
- su.getOutputStream().write(cmd.getBytes());
- if ((su.waitFor() != 0) || !device.canRead() || !device.canWrite()){
- throw new SecurityException();
- }
- }catch (Exception e){
- e.printStackTrace();
- throw new SecurityException();
- }
- }
- Log.i(TAG, "SerialPort is can read?"+device.canRead());
- Log.i(TAG,"SerialPort is can writter" + device.canWrite());
- mfd = open(device.getAbsolutePath(),baudrate);
- if(mfd == null){
- Log.e(TAG,"native open return null");
- }
- Log.i(TAG, "SerialPort>>>"+ mfd);
- mFileInputStream = new FileInputStream(mfd);
- outputStreaml = new FileOutputStream(mfd);
- }
- public InputStream getInputStream(){
- return mFileInputStream;
- }
- public OutputStream getOutputStream(){
- return outputStreaml;
- }
- private native static FileDescriptor open(String path, int baudrate);
- public native void close();
- static {
- System.loadLibrary("serialport");
- }
复制代码
MainActivity代码为- public void onClick(View view) {
- switch (view.getId()){
- case R.id.setup:
- try{
- sp = new SerialPort(new File("/dev/ttyS0"),115200);
- }catch (SecurityException e){
- e.printStackTrace();
- }catch (IOException e){
- e.printStackTrace();
- }
- fileInputStream = sp.getInputStream();
- fileOutputStream = sp.getOutputStream();
- break;
- case R.id.send:
- try {
- String str = "abc123";
- byte[] a = str.getBytes();
- byte b = 1;
- Log.i(TAG, "send>>> "+a[0]+a[1]+a[2]);
- fileOutputStream.write(a);
- fileOutputStream.write('\n');
- } catch (IOException e) {
- e.printStackTrace();
- }
- Toast.makeText(getApplicationContext(), "send",
- Toast.LENGTH_SHORT).show();
- break;
- case R.id.recevicd:
- int size;
- try {
- byte[] test = new byte[64];
- fileInputStream.read(test);
- byte[] buffer = new byte[64];
- if (fileInputStream == null)
- return;
- Log.i(TAG, "onClick: "+ buffer.length);
- Log.i(TAG, "recevied"+buffer.toString());
- size = fileInputStream.read(buffer);
- Log.i(TAG, "size>>>"+size);
- if (size > 0) {
- onDataReceived(buffer, size);
- }
- } catch (IOException e) {
- e.printStackTrace();
- return;
- }
- }
- }
- void onDataReceived(final byte[] buffer, final int size) {
- runOnUiThread(new Runnable() {
- public void run() {
- if (editText != null) {
- Log.i(TAG, "run: "+new String(buffer, 0, size));
- textView.setText(new String(buffer, 0, size));
- }
- }
- });
- }
复制代码 |
|