我在Android下想写一个串口接收文件的程序,通过Uart3来接收来自51单片机的文件数据,但是实际运行中,程序总是会丢失一小部分数据,比如300K的文件会丢失几百个字节。
因为之前的程序比较复杂,现在单独写了个简单的测试程序,通过定时器每隔几ms查询看串口有没有数据要读,如果有就关闭定时查询,进入while循环一直读取数据,并将数据写入文件,就这样一个简单的测试程序,还是会出现丢失数据的问题,想让大家帮忙看一下问题出在哪里(因为不知道串口缓冲有多大,所以我自己定义的buf是2048个字节)。
下面附上测试程序:
复制代码- public class UartTestActivity extends Activity {
- /** Called when the activity is first created. */
-
- private final int BAUDRATE_WIFI=115200;
- private final int DATABITS_WIFI=8;
- private final int STOPBITS_WIFI=1;
- private final String SERIAL_PORT_WIFI="/dev/s3c2410_serial3";
- private Handler mWifiHandler;
-
- private int serialToWifi;
- Timer timer;
- TimerTask task;
- long totalLen=0;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
-
- try{
- serialToWifi=HardwareControler.openSerialPort(SERIAL_PORT_WIFI, BAUDRATE_WIFI, DATABITS_WIFI, STOPBITS_WIFI);
- }catch(Exception e){
- Toast.makeText(this, "Wifi串口错误!", 500).show();
- }
-
- mWifiHandler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- int readLen;
-
- byte[] buf = new byte[2048];
- FileOutputStream fos = null;
- if(msg.arg1 == 1){
- try{
- if(HardwareControler.select(serialToWifi, 0, 0) == 1){
- stopRead();//////////////////////////////////////
- Log.i("ReadWifi", "有数据啦");
-
- fos = openFileOutput("update.txt",MODE_PRIVATE);
-
-
- long time = System.currentTimeMillis();
-
- while((System.currentTimeMillis() - time) < 60*1000){ //读1s,这里确定发送端肯定发送完毕了
- if((readLen = HardwareControler.read(serialToWifi, buf, buf.length)) > 0){
- totalLen += readLen;
- Log.i("读到" + readLen + "字节", "总共" + totalLen + "字节");
-
- fos.write(buf, 0, readLen);
- }
- Log.i("读到0字节", "读到0字节");
-
- }
- fos.flush();
- fos.close();
- }
- //initRead();///////////////////////
- }
- catch(Exception e){
- e.printStackTrace();
- }
-
- }//end of if
- } //end of public void handlerMessage()
- };//end of new
-
- initRead();
- }
-
-
- public void initRead(){
- timer = new Timer();
- task = new TimerTask() {
-
- @Override
- public void run() {
- // TODO Auto-generated method stub
- Message msg=mWifiHandler.obtainMessage();
- msg.arg1=1;
- mWifiHandler.sendMessage(msg);
- }
- };
-
- timer.schedule(task, 1, 1);
- }
-
- public void stopRead(){
- if(timer != null){
- timer.cancel();
- timer = null;
- }
- if(task != null){
- task.cancel();
- task = null;
- }
- }
- @Override
- protected void onDestroy() {
- // TODO Auto-generated method stub
- stopRead();
- super.onDestroy();
- }
-
-
- }
|