Firefly开源社区

打印 上一主题 下一主题

串口通信

40

积分

0

威望

0

贡献

游客

积分
40

串口通信

发表于 2016-8-17 08:27:20      浏览:6683 | 回复:0        打印      只看该作者   [复制链接] 楼主
我仿android-serial-api做的串口通信APP,对ttyS0~3进行读写操作发现并不能对ttyS0~3存取数据。
jni的代码
  1. JNIEXPORT jobject JNICALL Java_com_example_liangzhanpeng_urat_SerialPort_open
  2.   (JNIEnv *env, jclass thiz, jstring path, jint baudrate){
  3.     int fd;
  4.     speed_t speed;
  5.     jclass mFileDescriptor;
  6.     {
  7.     speed = getBaudrate(baudrate);
  8.     if (speed == -1){
  9.     LOGE("invalid baudrate");
  10.     return NULL;
  11.     }
  12.     }

  13.     {
  14.         jboolean iscopy;
  15.         const char *path_utf = (*env)->GetStringUTFChars(env, path, &iscopy);

  16.         LOGE("OPENING SERIAL PORT %s",path_utf);

  17.         fd = open(path_utf,O_RDWR | O_NOCTTY | O_NONBLOCK | O_NDELAY);
  18.         LOGD("open() fd = %d", fd);
  19.         (*env)->ReleaseStringUTFChars(env,path,path_utf);
  20.         if(fd == -1)
  21.         {
  22.             LOGE("cannot open port");
  23.             return NULL;
  24.         }
  25.     }

  26.     {
  27.         struct termios cfg;
  28.         LOGD("Configuring serial port");
  29.         if(tcgetattr(fd,&cfg))
  30.         {
  31.             LOGE("tcgetattr() failed");
  32.             close(fd);
  33.             return NULL;
  34.         }

  35.         cfmakeraw(&cfg);
  36.         cfsetispeed(&cfg,speed);
  37.         cfsetospeed(&cfg,speed);

  38.         if(tcsetattr(fd,TCSANOW,&cfg))
  39.         {
  40.             LOGE("tcsetattr() failed");
  41.             close(fd);
  42.             return NULL;
  43.         }
  44.     }
  45.     {
  46.         jclass cFileDescriptor = (*env)->FindClass(env, "java/io/FileDescriptor");
  47.         jmethodID iFileDescriptor = (*env)->GetMethodID(env, cFileDescriptor, "<init>", "()V");
  48.         jfieldID descriptorID = (*env)->GetFieldID(env, cFileDescriptor, "descriptor", "I");
  49.         mFileDescriptor = (*env)->NewObject(env, cFileDescriptor, iFileDescriptor);
  50.         (*env)->SetIntField(env, mFileDescriptor, descriptorID, (jint)fd);
  51.     }
  52.     return mFileDescriptor;
  53.   }
复制代码

串口操作代码为
  1. private FileDescriptor mfd;
  2.     private FileInputStream mFileInputStream;
  3.     private FileOutputStream outputStreaml;

  4.     public SerialPort(File device,int baudrate) throws SecurityException,IOException{
  5.         if (!device.canRead() || !device.canWrite()){
  6.             try{
  7.                 Process su;
  8.                 su = Runtime.getRuntime().exec("/system/xbin/su");

  9.                 Log.i(TAG, "SerialPort: "+su.toString());
  10.                 String cmd = "chmod 777 " + device.getAbsolutePath() + "\n" + "exit\n";
  11.                 Log.i(TAG, "SerialPort: " + cmd.toString());
  12.                 su.getOutputStream().write(cmd.getBytes());

  13.                 if ((su.waitFor() != 0) || !device.canRead() || !device.canWrite()){
  14.                     throw new SecurityException();
  15.                 }
  16.             }catch (Exception e){
  17.                 e.printStackTrace();
  18.                 throw new SecurityException();
  19.             }
  20.         }
  21.         Log.i(TAG, "SerialPort is can read?"+device.canRead());
  22.         Log.i(TAG,"SerialPort is can writter" + device.canWrite());
  23.         mfd = open(device.getAbsolutePath(),baudrate);
  24.         if(mfd == null){
  25.             Log.e(TAG,"native open return null");

  26.         }
  27.         Log.i(TAG, "SerialPort>>>"+ mfd);
  28.         mFileInputStream = new FileInputStream(mfd);
  29.         outputStreaml = new FileOutputStream(mfd);
  30.     }
  31.     public InputStream getInputStream(){
  32.         return mFileInputStream;
  33.     }
  34.     public OutputStream getOutputStream(){
  35.         return outputStreaml;
  36.     }
  37.     private native static FileDescriptor open(String path, int baudrate);
  38.     public native void close();
  39.     static {
  40.         System.loadLibrary("serialport");
  41.     }
复制代码

MainActivity代码为
  1. public void onClick(View view) {
  2.         switch (view.getId()){
  3.             case R.id.setup:

  4.             try{
  5.                 sp = new SerialPort(new File("/dev/ttyS0"),115200);
  6.             }catch (SecurityException e){
  7.                 e.printStackTrace();
  8.             }catch (IOException e){
  9.                 e.printStackTrace();
  10.             }
  11.                 fileInputStream = sp.getInputStream();
  12.                 fileOutputStream = sp.getOutputStream();
  13.                 break;
  14.             case R.id.send:
  15.                 try {
  16.                     String str = "abc123";
  17.                     byte[] a = str.getBytes();
  18.                     byte b = 1;
  19.                     Log.i(TAG, "send>>> "+a[0]+a[1]+a[2]);
  20.                     fileOutputStream.write(a);
  21.                     fileOutputStream.write('\n');
  22.                 } catch (IOException e) {
  23.                     e.printStackTrace();
  24.                 }


  25.                 Toast.makeText(getApplicationContext(), "send",
  26.                         Toast.LENGTH_SHORT).show();
  27.                 break;
  28.             case R.id.recevicd:
  29.                 int size;

  30.                 try {
  31.                     byte[] test = new byte[64];
  32.                     fileInputStream.read(test);

  33.                     byte[] buffer = new byte[64];
  34.                     if (fileInputStream == null)
  35.                         return;
  36.                     Log.i(TAG, "onClick: "+ buffer.length);
  37.                     Log.i(TAG, "recevied"+buffer.toString());
  38.                     size = fileInputStream.read(buffer);
  39.                     Log.i(TAG, "size>>>"+size);
  40.                     if (size > 0) {
  41.                         onDataReceived(buffer, size);

  42.                     }
  43.                 } catch (IOException e) {
  44.                     e.printStackTrace();
  45.                     return;
  46.                 }

  47.         }

  48.     }
  49.     void onDataReceived(final byte[] buffer, final int size) {
  50.         runOnUiThread(new Runnable() {
  51.             public void run() {
  52.                 if (editText != null) {
  53.                     Log.i(TAG, "run: "+new String(buffer, 0, size));
  54.                     textView.setText(new String(buffer, 0, size));
  55.                 }
  56.             }
  57.         });
  58.     }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表