Android串口 如何搞定android-serialport-api 能发不能收的问题

cbss30 2014-09-08 04:00:08
加精
刚刚接触android串口通讯。应届毕业生,自学的android。现在在搞串口和硬件变通器通讯时,出现了故障能发不能收。
串口转换器用的是pl2303(做软件第一次听说头都大了)。
采用的是android-serialport -api 的代码模式。感谢http://blog.csdn.net/akunainiannian/article/details/8740007
阿困的讲解让我明白需要先设置权限然后才可以在虚拟机上跑。
现在可以发送信息,抓包软件可以抓住,但是变送器没有数据返回。
发送数据的代码:
mOutputStream=(FileOutputStream) sp.getOutputStream();
mBuffer = new byte [] {(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0x02,(byte)0x80,(byte)0x00,(byte)0x00,(byte)0x82};
String s = new String(mBuffer);
mOutputStream.write(mBuffer);
数据格式需要符合HART通信协议。
现在就想问问怎么就没有返回数据呢!!!
望大家给给思路。
祝大家中秋快乐。
...全文
11631 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
dt20061113 2016-11-09
  • 打赏
  • 举报
回复
有delphi的手机串口处理办法吗?
执着的前进 2016-11-09
  • 打赏
  • 举报
回复
手机串口开发的是什么类型的app?或者是为了解决什么问题呢?
w09424 2015-10-28
  • 打赏
  • 举报
回复
终极解决方案: 串口的读写不能是同一个程序!其实你是发送成功了,本身你是读不出来的,得由另一个程序去读才能读出来。所以你写的代码本身是没有问题的。 虽然时间过去一年多了,还是给分吧~
baidu_20921715 2014-09-17
  • 打赏
  • 举报
回复
你得确认你使用的串口是那个,然后给权限才可以 比如你用的是/dev/ttyS2,那么你就给chmod 666 /dev/ttyS2 相应的权限 这个设定用谁接受在代码中你可以自己定义的!这样就不会盲目的进行接收操作了!
fujs333 2014-09-16
  • 打赏
  • 举报
回复
line_us 2014-09-14
  • 打赏
  • 举报
回复
很有趣的问题,看看怎么弄
cbss30 2014-09-12
  • 打赏
  • 举报
回复
引用 25 楼 bleank 的回复:
还有一个,你确定你的数据确实发送出去了?也就是说硬件变通器已经收到你通过串口发送过去的数据? 测试串口最简单的办法就是,将你的设备的串口与电脑串口连接起来,在电脑端打开一个串口调试工具。 1.设备发送数据给电脑,查看串口调试工具是否有接收到数据; 2.电脑发送数据给设备,设备端检查是否有接收到数据;
是hart转换器无法控制板上的RTS hart是单工的无法控制数据方向。 想知道serialport 怎么控制RTS
cstee 2014-09-11
  • 打赏
  • 举报
回复
jeky_zhang2013 2014-09-11
  • 打赏
  • 举报
回复
收不到数据,一直返回 receive null!! 换了串口:ttyGS1也是一样的
jeky_zhang2013 2014-09-11
  • 打赏
  • 举报
回复
引用 9 楼 f839903061 的回复:
我说一下我的步骤吧 1.修改init.???.rc文件,添加ttyS1~7 666权限 2.安装android-serial-api程序,不给权限就没法安装 3.设定串口,比如ttyS2,不指定就不知道谁接受发送 4.电脑端打开串口工具(网上有很多),两边的波特率要设置一样 5.两边进行收发测试! 没有其他的了
你好,麻烦帮我分析下为什么收到数据 send.c 主要代码

int nCount, nTotal, i;
struct termios oldtio, newtio;
char *dev ="/dev/ttyGS2";


if ((fd = open(dev, O_RDWR | O_NOCTTY))<0)
{
printf("err: can't open serial port!\n");
return -1;
}

tcgetattr(fd, &oldtio); /* save current serial port settings */
setTermios(&newtio, B115200);
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &newtio);
write(fd, "AT+CGMI\n", 8);
//nCount=write(fd, argv[2], strlen(argv[2]));
printf("send data\n");
sleep(1);
tcsetattr(fd, TCSANOW, &oldtio);
close(fd);
return 0;
接收:
fd = open("/dev/ttyGS2", O_RDWR);
if (fd == -1)
return -1;
printf("hello, Serial port is OK\n");

// 读取串口当前属性
tcgetattr(fd, &attr);
// 设置最少接收字符个数为0
attr.c_cc[VMIN] = 0;
// 不处理iflag、oflag和lflag
attr.c_iflag = 0;
attr.c_oflag = 0;
attr.c_lflag = 0;
// 设置波特率为9600,字符长度为8位,偶校验,允许接收
attr.c_cflag = B115200 | CS8 | CREAD;
// 设置串口属性
tcsetattr(fd, TCSANOW, &attr);
//write(fd, "AT+CGMI", 8);
// 清除监测集合
FD_ZERO(&fds);
// 将串口句柄加入到监测集合中
FD_SET(fd, &fds);
// 设置超时为5秒
tv.tv_sec = 5;
tv.tv_usec = 0;


// 监测串口是否有数据接收到,超时为5秒
if (select(fd+1, &fds, NULL, NULL, &tv) <= 0)
{
printf("receive null!!\n");
return -1;
}
// 接收最多100个字符
nread=read(fd, buf, 512);
printf("readlength=%d\n", nread);
buf[nread]='\0';
printf("%s\n", buf);

// 关闭串口
close(fd);
return 0;
line_us 2014-09-11
  • 打赏
  • 举报
回复
看看怎么弄才行
jeky_zhang2013 2014-09-11
  • 打赏
  • 举报
回复
引用 14 楼 ruantianyu 的回复:
百度或者google下来的测试用例,都不能直接使用~ 我自己写了一个简单的串口程序,简单易懂,不过是在我自己的板子上面用的~有需要的么
麻烦发我一份,多谢了,好好分析下~~ zzl_jeky@163.com
cbss30 2014-09-11
  • 打赏
  • 举报
回复
引用 12 楼 mjp1234airen4385 的回复:
也许是你的发送的不对,硬件接收不到正确的命令,故而没给你返回数据。 你直接发送byte数组,不要发送String试试。
已经使用了byte数组了。
cbss30 2014-09-11
  • 打赏
  • 举报
回复
引用 14 楼 ruantianyu 的回复:
百度或者google下来的测试用例,都不能直接使用~ 我自己写了一个简单的串口程序,简单易懂,不过是在我自己的板子上面用的~有需要的么
android 中如何设置RTX 高低电平呀 数据下到板上高低电平过不去呀。
cbss30 2014-09-11
  • 打赏
  • 举报
回复
引用 7 楼 f839903061 的回复:
[quote=引用 6 楼 cbss30 的回复:] [quote=引用 5 楼 f839903061 的回复:] [quote=引用 4 楼 cbss30 的回复:] [quote=引用 3 楼 f839903061 的回复:] 你得确认你使用的串口是那个,然后给权限才可以 比如你用的是/dev/ttyS2,那么你就给chmod 666 /dev/ttyS2 相应的权限 这个设定用谁接受在代码中你可以自己定义的!这样就不会盲目的进行接收操作了!
我也是百度来的 启动前 先adb shell # cd /dev #chmod 777 ttyS2 具体什么作用不懂,大概知道是权限。 发送数据后 变送器就没反应了 [/quote] 我是给你举的例子用的ttyS2,你的真实情况也有可能是其他的呢,这个你可以在代码中设定的!android-serial-api[/quote] 在代码中已经设定. sp=new SerialPort(new File("/dev/ttyS2"),1200); 并指定了波特率1200 。 usb转串口在那个芯片是单工的 用示波器测试就是死在那里在 单工是不是要控制上行或下行,没啥思路了。。。 [/quote] android的波特率一般都是这是为115200 [/quote] 用到在HART转换器必须要用这个波特率 没办法。 现在发现是android ssrialport 无法控制硬件中在RTX 要是能控制就能让它 上行或下行了。
ruantianyu 2014-09-11
  • 打赏
  • 举报
回复
百度或者google下来的测试用例,都不能直接使用~
我自己写了一个简单的串口程序,简单易懂,不过是在我自己的板子上面用的~有需要的么
hugh_z 2014-09-11
  • 打赏
  • 举报
回复
learning
mjp1234airen4385 2014-09-11
  • 打赏
  • 举报
回复
也许是你的发送的不对,硬件接收不到正确的命令,故而没给你返回数据。 你直接发送byte数组,不要发送String试试。
贝克汉姆_-- 2014-09-11
  • 打赏
  • 举报
回复
9楼正解。
GW786228836 2014-09-11
  • 打赏
  • 举报
回复
加载更多回复(12)

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧