powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Serial Port
57 сообщений из 57, показаны все 3 страниц
Serial Port
    #38678804
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не удается сконфигурировать порт. Где-то путаю параметры. может кто нибудь указать как "найти соответствие"?
С
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
	
                cfmakeraw(&cfg);

		cfsetispeed(&cfg, speed);
		cfsetospeed(&cfg, speed);


		cfg.c_cflag     &=  ~PARENB;        // Make 8n1
		cfg.c_cflag     &=  ~CSTOPB;
		cfg.c_cflag     &=  ~CSIZE;
		cfg.c_cflag     |=  CS8;

		cfg.c_cflag     &=  ~CRTSCTS;       // no flow control
		cfg.c_cc[VMIN]      =   1;                  // read doesn't block
		cfg.c_cc[VTIME]     =   5;                  // 0.5 seconds read timeout
		cfg.c_cflag     |=  CREAD | CLOCAL;     // turn on READ & ignore ctrl lines


		if (tcsetattr(fd, TCSANOW, &cfg))

и порт приемника
Делфи
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
if not GetCommState(ComFile, DCB) then
    Result := False;


  Config := 'baud=115200 parity=N data=8 stop=1';

  if not BuildCommDCB(@Config[1], DCB) then
    Result := False;

  if not SetCommState(ComFile, DCB) then
    Result := False;

  with CommTimeouts do
  begin
    ReadIntervalTimeout         := MAXDWORD;
    ReadTotalTimeoutMultiplier  := 0;
    ReadTotalTimeoutConstant    := 0;
    WriteTotalTimeoutMultiplier := 0;
    WriteTotalTimeoutConstant   := 0;
  end;

  if not SetCommTimeouts(ComFile, CommTimeouts) then
    Result := False;

П.С. если делаю замкнутую цепь на пк (делфи/делфи) - все работает норм. ... а устройство/пк (С/делфи) передает некорректные данные... (данные приходят, но не те .... к примеру я передаю {5,10,7}, а приходит {5,12,65,254})
...
Рейтинг: 0 / 0
Serial Port
    #38678829
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Размазал тему по форуму. :)
SerialPort.c
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
/*
 * Copyright 2009-2011 Cedric Priscal
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <jni.h>

#include "SerialPort.h"

#include "android/log.h"
static const char *TAG="serial_port";
#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO,  TAG, fmt, ##args)
#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args)

static speed_t getBaudrate(jint baudrate)
{
        switch(baudrate) {
        case 0: return B0;
        case 50: return B50;
        case 75: return B75;
        case 110: return B110;
        case 134: return B134;
        case 150: return B150;
        case 200: return B200;
        case 300: return B300;
        case 600: return B600;
        case 1200: return B1200;
        case 1800: return B1800;
        case 2400: return B2400;
        case 4800: return B4800;
        case 9600: return B9600;
        case 19200: return B19200;
        case 38400: return B38400;
        case 57600: return B57600;
        case 115200: return B115200;
        case 230400: return B230400;
        case 460800: return B460800;
        case 500000: return B500000;
        case 576000: return B576000;
        case 921600: return B921600;
        case 1000000: return B1000000;
        case 1152000: return B1152000;
        case 1500000: return B1500000;
        case 2000000: return B2000000;
        case 2500000: return B2500000;
        case 3000000: return B3000000;
        case 3500000: return B3500000;
        case 4000000: return B4000000;
        default: return -1;
        }
}

static int getParity(jint parity)
{
	switch (parity) {
	case 1: return PARENB | PARODD;
	case 2: return PARENB;
	}
	return 0;
}

static int getSize(jint size)
{
	switch (size){
	case 6: return CS6;
	case 7: return CS7;
	case 8: return CS8;
	}
	return 0;
}

static int getStopBit(jint stopb)
{
	switch (stopb){
	case 2: return CSTOPB;
	}
	return 0;
}

/*
 * Class:     android_serialport_SerialPort
 * Method:    open
 * Signature: (Ljava/lang/String;II)Ljava/io/FileDescriptor;
 */
JNIEXPORT jobject JNICALL Java_ru_wadman_serialport_SerialPort_open
  (JNIEnv *env, jclass thiz, jstring path, jint flags)
{
        jobject mFileDescriptor;
        int fd;

        /* Opening device */
        {
                jboolean iscopy;
                const char *path_utf = (*env)->GetStringUTFChars(env, path, &iscopy);
                LOGD("Opening serial port %s with flags 0x%x", path_utf, O_RDWR | flags);
                fd = open(path_utf, O_RDWR | flags);
                LOGD("open() fd = %d", fd);
                (*env)->ReleaseStringUTFChars(env, path, path_utf);
                if (fd == -1)
                {
                        /* Throw an exception */
                        LOGE("Cannot open port");
                        /* TODO: throw an exception */
                        return NULL;
                }
        }

        /* Create a corresponding file descriptor */
        {
                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;
}

JNIEXPORT void JNICALL Java_ru_wadman_serialport_SerialPort_config
  (JNIEnv *env, jclass thiz, jint baudrate, jint size, jint parity, jint stops)
{
    int fd;
    speed_t speed;
    /* Check arguments */
	{
		speed = getBaudrate(baudrate);
		if (speed == -1) {
			/* TODO: throw an exception */
			LOGE("Invalid baudrate");
			return;
		}
	}

    jclass SerialPortClass = (*env)->GetObjectClass(env, thiz);
    jclass FileDescriptorClass = (*env)->FindClass(env, "java/io/FileDescriptor");

    jfieldID mFdID = (*env)->GetFieldID(env, SerialPortClass, "mFd", "Ljava/io/FileDescriptor;");
    jfieldID descriptorID = (*env)->GetFieldID(env, FileDescriptorClass, "descriptor", "I");

    jobject mFd = (*env)->GetObjectField(env, thiz, mFdID);
    jint descriptor = (*env)->GetIntField(env, mFd, descriptorID);

    LOGD("config() fd = %d", descriptor);
    /* Configure device */
        {
                struct termios cfg;
                if (tcgetattr(descriptor, &cfg) != 0)
                {
                	LOGE("tcgetattr() failed (fd = %d, err = %d)", descriptor, errno);
                        //close(descriptor);
                        /* TODO: throw an exception */
                        return;
                }

                cfmakeraw(&cfg);
                cfsetispeed(&cfg, speed);
                cfsetospeed(&cfg, speed);

                cfg.c_cflag &= ~PARENB;
                cfg.c_cflag &= ~PARODD;
                cfg.c_cflag &= ~CSIZE;
                cfg.c_cflag &= ~CSTOPB;
                cfg.c_cflag |= (CLOCAL | CREAD) | getSize(size) | getParity(parity) | getStopBit(stops);

                if (tcsetattr(descriptor, TCSANOW, &cfg) != 0)
                {
                        LOGE("tcsetattr() failed (fd = %d, err = %d)", descriptor, errno);
                        //close(descriptor);
                        /* TODO: throw an exception */
                        return;
                }
        }

}

/*
 * Class:     cedric_serial_SerialPort
 * Method:    close
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_ru_wadman_serialport_SerialPort_close
  (JNIEnv *env, jobject thiz)
{
        jclass SerialPortClass = (*env)->GetObjectClass(env, thiz);
        jclass FileDescriptorClass = (*env)->FindClass(env, "java/io/FileDescriptor");

        jfieldID mFdID = (*env)->GetFieldID(env, SerialPortClass, "mFd", "Ljava/io/FileDescriptor;");
        jfieldID descriptorID = (*env)->GetFieldID(env, FileDescriptorClass, "descriptor", "I");

        jobject mFd = (*env)->GetObjectField(env, thiz, mFdID);
        jint descriptor = (*env)->GetIntField(env, mFd, descriptorID);

        LOGD("close() fd = %d", descriptor);
        tcflush(descriptor, TCIOFLUSH);
        close(descriptor);
}



SerialPort.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class android_serialport_api_SerialPort */

#ifndef _Included_android_serialport_api_SerialPort
#define _Included_android_serialport_api_SerialPort
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     android_serialport_api_SerialPort
 * Method:    open
 * Signature: (Ljava/lang/String;II)Ljava/io/FileDescriptor;
 */
JNIEXPORT jobject JNICALL Java_ru_wadman_serialport_SerialPort_open
  (JNIEnv *, jclass, jstring, jint);

JNIEXPORT void JNICALL Java_ru_wadman_serialport_SerialPort_config
  (JNIEnv *env, jclass, jint, jint, jint, jint);

/*
 * Class:     android_serialport_api_SerialPort
 * Method:    close
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_ru_wadman_serialport_SerialPort_close
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif



SerialPort.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
/*
 * Copyright 2009 Cedric Priscal
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License. 
 */

package ru.wadman.serialport;

import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.util.Log;

public class SerialPort {

		public final static int SERIALPORT_NOPARITY		= 0;
		public final static int SERIALPORT_ODDPARITY	= 1;
		public final static int SERIALPORT_EVENPARITY	= 2;
		public final static int SERIALPORT_SIZE5		= 5;
		public final static int SERIALPORT_SIZE6		= 6;
		public final static int SERIALPORT_SIZE7		= 7;
		public final static int SERIALPORT_SIZE8		= 8;
		public final static int SERIALPORT_1STOPBIT		= 1;
		public final static int SERIALPORT_2STOPBIT		= 2;

		private static final String TAG = "SerialPort";
        
        /* 
         * Do not remove or rename the field mFd: it is used by native method close();
         */
        private FileDescriptor mFd;
        private FileInputStream mFileInputStream;
        private FileOutputStream mFileOutputStream;

        public SerialPort(File device, int flags) throws SecurityException, IOException {

                /* Check access permission */
                if (!device.canRead() || !device.canWrite()) {
                        try {
                                /* Missing read/write permission, trying to chmod the file */
                                Process su;
                                su = Runtime.getRuntime().exec("su");
                                String cmd = "chmod 666 " + device.getAbsolutePath() + "\n"
                                                + "exit\n";
                                su.getOutputStream().write(cmd.getBytes());
                                if ((su.waitFor() != 0) || !device.canRead()
                                                || !device.canWrite()) {
                                        throw new SecurityException();
                                }
                        } catch (Exception e) {
                                e.printStackTrace();
                                throw new SecurityException();
                        }
                }

                mFd = open(device.getAbsolutePath(), flags);
                if (mFd == null) {
                        Log.e(TAG, "native open returns null");
                        throw new IOException();
                }
                mFileInputStream = new FileInputStream(mFd);
                mFileOutputStream = new FileOutputStream(mFd);
        }

        // Getters and setters
        public InputStream getInputStream() {
                return mFileInputStream;
        }

        public OutputStream getOutputStream() {
                return mFileOutputStream;
        }

        // JNI
        private native static FileDescriptor open(String path, int flags);
        public native void config(int baudrate, int size, int parity, int stopb);
        public native void close();
        static {
                System.loadLibrary("serial_port");
        }
}



Слабо было попросить? :)
...
Рейтинг: 0 / 0
Serial Port
    #38678872
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

изменять что-но не видел смысла, но все равно изменил и подставил твой код, что бы было меньше сомнений. :-)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
static speed_t getBaudrate(jint baudrate)
{
	switch(baudrate) {
	case 0: return B0;
	case 50: return B50;
	case 75: return B75;
	case 110: return B110;
	case 134: return B134;
	case 150: return B150;
	case 200: return B200;
	case 300: return B300;
	case 600: return B600;
	case 1200: return B1200;
	case 1800: return B1800;
	case 2400: return B2400;
	case 4800: return B4800;
	case 9600: return B9600;
	case 19200: return B19200;
	case 38400: return B38400;
	case 57600: return B57600;
	case 115200: return B115200;
	case 230400: return B230400;
	case 460800: return B460800;
	case 500000: return B500000;
	case 576000: return B576000;
	case 921600: return B921600;
	case 1000000: return B1000000;
	case 1152000: return B1152000;
	case 1500000: return B1500000;
	case 2000000: return B2000000;
	case 2500000: return B2500000;
	case 3000000: return B3000000;
	case 3500000: return B3500000;
	case 4000000: return B4000000;
	default: return -1;
	}
}

static int getParity(jint parity)
{
	switch (parity) {
	case 1: return PARENB | PARODD;
	case 2: return PARENB;
	}
	return 0;
}

static int getSize(jint size)
{
	switch (size){
	case 6: return CS6;
	case 7: return CS7;
	case 8: return CS8;
	}
	return 0;
}

static int getStopBit(jint stopb)
{
	switch (stopb){
	case 2: return CSTOPB;
	}
	return 0;
}




Андроид - JAVA<-C (устройство)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	public final static int SERIALPORT_NOPARITY		= 0;
	public final static int SERIALPORT_ODDPARITY	= 1;
	public final static int SERIALPORT_EVENPARITY	= 2;
	public final static int SERIALPORT_SIZE5		= 5;
	public final static int SERIALPORT_SIZE6		= 6;
	public final static int SERIALPORT_SIZE7		= 7;
	public final static int SERIALPORT_SIZE8		= 8;
	public final static int SERIALPORT_1STOPBIT		= 1;
	public final static int SERIALPORT_2STOPBIT		= 2;

mySerialPort.config(115200, mySerialPort.SERIALPORT_SIZE8, mySerialPort.SERIALPORT_NOPARITY, mySerialPort.SERIALPORT_1STOPBIT);



Делфи (ПК)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
if not GetCommState(ComFile, DCB) then
    Result := False;


  Config := 'baud=115200 parity=N data=8 stop=1';

  if not BuildCommDCB(@Config[1], DCB) then
    Result := False;

  if not SetCommState(ComFile, DCB) then
    Result := False;



Все равно не совпадают данные
...
Рейтинг: 0 / 0
Serial Port
    #38678894
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4er,

к слову мой код работает с реальной железкой на андроиде аналогично как и с компа
. Так что ищи проблему в другом месте.
...
Рейтинг: 0 / 0
Serial Port
    #38679237
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, судя по http://ulisse.elettra.trieste.it/services/doc/serial/config.html раздел Setting Parity Checking , конфигурация 8N1 и 7S1 совпадают... Если ты сам конфигурируешь обе стороны обмена, то поиграйся с другими настройками.

Кстати, что отправляешь, что получаешь и каким кодом там и там?
...
Рейтинг: 0 / 0
Serial Port
    #38679744
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Отправляю кодом
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
                           byte dataToWrite[] = {0,0,0};	//случайный набор байт
		    	   try
		    	   {   Log.d(TAG, "start Write");							
		    		   mySerialPort.getOutputStream().write(dataToWrite);    	
		    		   Log.d(TAG, "finish Write");
		    	   }
		    	   catch(IOException ioe) 
		    	   {
		    		  ioe.printStackTrace();  
		    	   }

считываю
ПК
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
  PCommPort = ^TCommPort;
  TCommPort = packed record
//поля инициализируемые программой-пользователем
    Port    : byte; //номер порта
    DCB     : TDCB;    //параметры порта
    Owner   : THandle; //Handle владельца. Для отправки сообщений
//далее поля заполняются автоматически
    Handle  : THandle; //Handle порта
    Stat    : TComStat; //текущее состояние порта
    Thread  : THandle; //ссылка на поток чтения из порта
    Data    : packed array[0..BuffSize-1] of byte; //полученные данные
    DataCount:integer; //количество данных в буфере
//    Packets:TPackets; //Полученная информация
    ReadMutex   : THandle; //семафор работы чтения из порта
//    WriteMutex  : THandle; //семафор работы записи в порт
    SendPacket  : Cardinal;        //число отправленных пакетов
    RecivePacket: Cardinal;         // число полученных пакетов
    SendByte    : Cardinal;       //число отправленных байт
    ReciveByte  : Cardinal;       //число полученных байт
    ApprovalByte: Cardinal;       //обработано (действительных) байт
    Terminated:Boolean;//признак завершения объмена с портом и его закрытие
  end;

...
const
WM_COM_RECIVE     = WM_USER+10; //сообщение о приходе пакета


........


procedure CommExecute(CommPort:PCommPort); stdcall;
var
  Overlapped:TOverlapped;
  Mask:Cardinal;
  RecivedCount:Cardinal;
  Errs:Cardinal;

begin

  FillChar(Overlapped,SizeOf(Overlapped),0);
  Overlapped.hEvent := CreateEvent(nil,false,false,nil);
  try
    while not CommPort.Terminated do
    begin
      Mask:=0;

      if not WaitCommEvent(CommPort.Handle,Mask,@OverLapped) then
      begin
        Errs:=GetLastError();
        if Errs = ERROR_IO_PENDING then
          GetOverlappedResult(CommPort.Handle,Overlapped,Errs,true)
        Else Begin
          CommPort.Terminated:=true;
          PostMessage(CommPort.Owner,WM_COM_LOSTCONNECT,Errs,0);
        End;
      End;

      ClearCommError(CommPort.Handle,Errs,@CommPort.Stat);

      if CommPort.Terminated then break;

      //if Mask = 0 then continue;
      //if Mask=EventMask then //проверяем нужное событие
      begin
        ClearCommError(CommPort.Handle,Errs,@CommPort.Stat);

        WaitForSingleObject(CommPort.ReadMutex,INFINITE);

        While (CommPort.Stat.cbInQue>0) and not CommPort.Terminated do
        Begin
          if CommPort.Stat.cbInQue<=Cardinal(BuffSize-CommPort.DataCount) then  //определение сколько прочитать в буфер
            RecivedCount:=CommPort.Stat.cbInQue
          Else
            RecivedCount:=BuffSize-CommPort.DataCount;

          if not ReadFile(CommPort.Handle,CommPort.Data[CommPort.DataCount],
            RecivedCount,RecivedCount,@OverLapped)//читаем  пакеты в буфер

          then begin
            Errs:=GetLastError();

            if Errs = ERROR_IO_PENDING then

              GetOverlappedResult(CommPort.Handle,Overlapped,Errs,true);

          end;

          inc(CommPort.DataCount,RecivedCount);
          inc(CommPort.ReciveByte,RecivedCount);

          if CommPort.Terminated then break;

          ClearCommError(CommPort.Handle,Errs,@CommPort.Stat);
        End;

        ReleaseMutex(CommPort.ReadMutex);
        if CommPort.DataCount>1 then  PostMessage(CommPort.Owner,WM_COM_RECIVE,portNull,portNull);
      End;
    End;
  finally
    CloseHandle(Overlapped.hEvent);
  end;
end;
........

procedure TfrmMain.USBReciveMsg(var Message: TMessage);     //msg -> WM_COM_RECIVE

var i,j:Integer;
  s:string;

begin
  WaitForSingleObject(CommPort.ReadMutex,INFINITE);

  if not CommPort.DataCount>0 then Exit;

  s:='';
  with CommPort do
  for i := 0 to DataCount-1 do s:=s+' '+ inttostr(Data[i]);
  memDATA.Lines.Add(s);
  FillChar(CommPort.Data,CommPort.DataCount,0);
  CommPort.DataCount:=0;

  ReleaseMutex(CommPort.ReadMutex);
end;

При отправке {0,0,0} (три байта со значением "0"). Приходят данные(на пк):
Скрин многоразовой отправки данных
при обратном обращении (отправляю с пк принимаю на устройстве) такая же самая ситуация... приходит мусор.
У меня вот вопрос... может загвоздка в классах "InputStream/OtputStream"? ... может их как то настраивать что ли нужно..?
...
Рейтинг: 0 / 0
Serial Port
    #38679821
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4erУ меня вот вопрос... может загвоздка в классах "InputStream/OtputStream"? ... может их как то настраивать что ли нужно..?
С ними все в порядке, что в них пишешь, то там и остается, как показал мой опыт. Да и не только мой.

На скрине мусор какой-то, при чем даже от 2-х до 4-х байт. Особой систематичности не вижу.

Это пробовал?
wadmanЕсли ты сам конфигурируешь обе стороны обмена, то поиграйся с другими настройками.
...
Рейтинг: 0 / 0
Serial Port
    #38679893
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

На ресурсе пишут использовать какую то "очистку буфера" .. может в этом загвоздка? Я пробовал её подставить при конфигурации порта, и подставлять перед отправкой данных но это ничего не дало...

П.С. Изменить настройки сейчас попробую
...
Рейтинг: 0 / 0
Serial Port
    #38679926
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4erНа ресурсе пишут использовать какую то "очистку буфера" ..
Это не очистка, а выталкивание содержимого буфера. Обычно делается перед закрытием и мне, к примеру, оно ни разу не пригодилось.

А очистка делается так: PurgeComm(hCommFile, PURGE_RXABORT + PURGE_RXCLEAR);
...
Рейтинг: 0 / 0
Serial Port
    #38679958
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanBoJI4erНа ресурсе пишут использовать какую то "очистку буфера" ..
Это не очистка, а выталкивание содержимого буфера. Обычно делается перед закрытием и мне, к примеру, оно ни разу не пригодилось.

А очистка делается так: PurgeComm(hCommFile, PURGE_RXABORT + PURGE_RXCLEAR);Ясно..

И так.. поигрался я настройками и вот к чему пришел параметры 8N1 оставил прежними, а при скорости в B9600 все стало передаваться корректно . ... почему такое может быть ума не приложу.. просматривал по шагам.. вроде бы скорость менялась.. :\
...
Рейтинг: 0 / 0
Serial Port
    #38679968
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4er при скорости в B9600 все стало передаваться корректно
Видимо железячное ограничение. Такие моменты обычно оговариваются в документации.
...
Рейтинг: 0 / 0
Serial Port
    #38679987
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

мдам.. к сожалению там такого не было... я эту документацию месяц "грыз", перед тем как покупать устройство.


Появилась другая проблема... на прием не приходят данные.. :\ (отправляю нажатием клавиши) принимаю так же, по нажатию клавиши... ... в этом может быть загвоздка??
...
Рейтинг: 0 / 0
Serial Port
    #38680016
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4erв этом может быть загвоздка??
Еще как может. Принимающий должен всегда держать порт открытым и слушать. И никак иначе.
...
Рейтинг: 0 / 0
Serial Port
    #38680021
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

порт всегда открытый, только читаю я из порта по нажатию клавиши...

сделал на быструю руку так, потому что на компе все корректно читалось.. сейчас переделаю на постоянное чтение...
...
Рейтинг: 0 / 0
Serial Port
    #38680034
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4erсейчас переделаю на постоянное чтение...
Вот это новость. :)

Поток должен ждать событие от ком-порта и затем начинает чтение. Документации об этом полно в сети, в т.ч. и готовые модули имеются.
...
Рейтинг: 0 / 0
Serial Port
    #38680046
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanBoJI4erсейчас переделаю на постоянное чтение...
Вот это новость. :)

Поток должен ждать событие от ком-порта и затем начинает чтение. Документации об этом полно в сети, в т.ч. и готовые модули имеются.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
  new Thread(new Runnable() {
	 	    	      public void run() {
	 	    	    	 try
	 		 	    	   {							//случайный набор байт
	 	    	    		 Log.d(TAG, "start read");
	 		 	    		   while (1>0)
	 		 	    		   {
	 		 	    		   
		 		 	    		   byte dataToRead[] = {0,0,0};
		 		 	    		   
		 		 	    		   int k = mySerialPort.getInputStream().read(dataToRead); 
		 		 	    		   Log.d(TAG, "readed bytes - "+Integer.toString(k));	 		 	    		   
		 		 	    		   if (k>0) {
		 		 	    			   itemAdapter.clear();	
		 			 	    		   for (int i = 0; i < dataToRead.length; i++) {
		 			 	    		   itemArrey.add(0,Byte.toString(dataToRead[i]));}
		 		 	    		   }
		 		 	    		   
	 		 	    		   }
	 		 	    		  
	 		 	    		    
	 		 	    	   }
	 		 	    	   catch(IOException ioe) 
	 		 	    	   {
	 		 	    		  ioe.printStackTrace();  
	 		 	    	   }	
	 	    	      }
	 	    	    }).start();  

что я здесь сделал не так, что он мне при чтении всегда возвращает "-1"???
...
Рейтинг: 0 / 0
Serial Port
    #38680049
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4erwadmanпропущено...

Вот это новость. :)

Поток должен ждать событие от ком-порта и затем начинает чтение. Документации об этом полно в сети, в т.ч. и готовые модули имеются.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
  new Thread(new Runnable() {
	 	    	      public void run() {
	 	    	    	 try
	 		 	    	   {							//случайный набор байт
	 	    	    		 Log.d(TAG, "start read");
	 		 	    		   while (1>0)
	 		 	    		   {
	 		 	    		   
		 		 	    		   byte dataToRead[] = {0,0,0};
		 		 	    		   
		 		 	    		   int k = mySerialPort.getInputStream().read(dataToRead); 
		 		 	    		   Log.d(TAG, "readed bytes - "+Integer.toString(k));	 		 	    		   
		 		 	    		   if (k>0) {
		 		 	    			   itemAdapter.clear();	
		 			 	    		   for (int i = 0; i < dataToRead.length; i++) {
		 			 	    		   itemArrey.add(0,Byte.toString(dataToRead[i]));}
		 		 	    		   }
		 		 	    		   
	 		 	    		   }
	 		 	    		  
	 		 	    		    
	 		 	    	   }
	 		 	    	   catch(IOException ioe) 
	 		 	    	   {
	 		 	    		  ioe.printStackTrace();  
	 		 	    	   }	
	 	    	      }
	 	    	    }).start();  


что я здесь сделал не так, что он мне при чтении всегда возвращает "-1"???
А зачем ты считаешь в яве? На сколько я понял, она должна отправлять на комп или нет?
...
Рейтинг: 0 / 0
Serial Port
    #38680051
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanА зачем ты читаешь в яве? На сколько я понял, она должна отправлять на комп или нет?
Поправил.
...
Рейтинг: 0 / 0
Serial Port
    #38680056
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerialPortActivity помнишь?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
package ru.wadman.serialporttest.app;

/**
 * Created by wadman on 29.05.2014.
 */

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.InvalidParameterException;

import ru.wadman.serialport.SerialPort;

public abstract class SerialPortActivity extends Activity {

    protected Application mApplication;
    protected SerialPort mSerialPort;
    protected OutputStream mOutputStream;
    private InputStream mInputStream;
    private ReadThread mReadThread;

    private class ReadThread extends Thread {

        @Override
        public void run() {
            super.run();
            while(!isInterrupted()) {
                int size;
                try {
                    byte[] buffer = new byte[64];
                    if (mInputStream == null) return;
                    size = mInputStream.read(buffer);
                    if (size > 0) {
                        onDataReceived(buffer, size);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    return;
                }
            }
        }
    }

    private void DisplayError(int resourceId) {
        AlertDialog.Builder b = new AlertDialog.Builder(this);
        b.setTitle("Error");
        b.setMessage(resourceId);
        b.setPositiveButton("OK", new OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                SerialPortActivity.this.finish();
            }
        });
        b.show();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mApplication = (Application) getApplication();
        try {
            mSerialPort = mApplication.getSerialPort();
            mOutputStream = mSerialPort.getOutputStream();
            mInputStream = mSerialPort.getInputStream();

                        /* Create a receiving thread */
            mReadThread = new ReadThread();
            mReadThread.start();
        } catch (SecurityException e) {
            DisplayError(R.string.error_security);
        } catch (IOException e) {
            DisplayError(R.string.error_unknown);
        } catch (InvalidParameterException e) {
            DisplayError(R.string.error_configuration);
        }
    }

    protected abstract void onDataReceived(final byte[] buffer, final int size);

    @Override
    protected void onDestroy() {
        if (mReadThread != null)
            mReadThread.interrupt();
        mApplication.closeSerialPort();
        mSerialPort = null;
        super.onDestroy();
    }
}

...
Рейтинг: 0 / 0
Serial Port
    #38680111
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanА зачем ты читаешь в яве? На сколько я понял, она должна отправлять на комп или нет?
Вообщем схема такая [ Контроллер ]<RS232>[ устройство ]<USB/WiFi/Ethernet>[ клиент (n)] (тип подключения к клиенту может быть одним из 3ех и в любой момент меняться)
где n, номер подключенного клиента (количество подключений пока что ограничено лишь производительностью устройства ).

контроллер с устройством ведут обмен постоянно. устройство с клиентом только в случае, если клиент передает данные и/или клиенту необходимо получить данные.

при это устройство всегда обрабатывает полученные данные (не важно от клиента они или от контроллера ).

понятно растолковал ..? (а то я умею запутать :) )
...
Рейтинг: 0 / 0
Serial Port
    #38680127
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4erпонятно растолковал ..? (а то я умею запутать :) )
Вроде понятно. Смотри как в примере реализовано чтение.
...
Рейтинг: 0 / 0
Serial Port
    #38680143
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanBoJI4erпонятно растолковал ..? (а то я умею запутать :) )
Вроде понятно. Смотри как в примере реализовано чтение.
по сути дела у меня тоже самое, только я данные с помощью адаптера вывожу на экран (в ListView)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
	  new Thread(new Runnable() {
	 	    	      public void run() {
	 	    	    	 try
	 		 	    	   {							
	 	    	    		   Log.d(TAG, "start read");
	 	    	    		   InputStream myInPutStream = mySerialPort.getInputStream(); 
	 		 	    		   while (1>0)
	 		 	    		   { 
		 		 	    		   byte[] dataToRead = new byte[64];
		 		 	    		   int size;
		 		 	    		   size = myInPutStream.read(dataToRead);   		   
		 		 	    		   if (size>0) {
		 		 	    			   itemAdapter.clear();	
		 		 	    			   Log.d(TAG, "readed bytes - "+Integer.toString(size));	
		 			 	    		   for (int i = 0; i < dataToRead.length; i++) {
		 			 	    		   itemArrey.add(0,Byte.toString(dataToRead[i]));}
		 		 	    		   }
	 		 	    		   }
	 		 	    	   }
	 		 	    	   catch(IOException ioe) 
	 		 	    	   {
	 		 	    		  ioe.printStackTrace();  
	 		 	    	   }	
	 	    	      }
	 	    	    }).start();  
	 	       }
	 	     };




может проблема где то в настройках, при открытии файла?? На сколько я помню, в линуксе что-то должно на чтение настраиваться, при открытии файла...
...
Рейтинг: 0 / 0
Serial Port
    #38680149
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4er...
может проблема где то в настройках, при открытии файла?? На сколько я помню, в линуксе что-то должно на чтение настраиваться, при открытии файла...

в данный момент, открытие выполняется вот так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
/* Opening device */
	{
		jboolean iscopy;
		const char *path_utf = (env)->GetStringUTFChars( path, &iscopy);

		flags = O_NOCTTY | O_NDELAY;

		LOGD("Opening serial port %s with flags 0x%x", path_utf, O_RDWR | flags);
		LOGE("my port %d",fd);
		fd = open(path_utf, O_RDWR | flags);

		LOGE("my opened port %d",fd);
		(env)->ReleaseStringUTFChars( path, path_utf);
		if (fd == -1)
		{
			/* Throw an exception */
			LOGE("Cannot open port");
			/* TODO: throw an exception */
			return NULL;
		}
		else fcntl(fd, F_SETFL, 0);

	}
...
Рейтинг: 0 / 0
Serial Port
    #38680158
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как открывается - смотри выше, у меня полностью рабочий код.
...
Рейтинг: 0 / 0
Serial Port
    #38680180
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanКак открывается - смотри выше, у меня полностью рабочий код.

странно.. у меня все тоже самое.. единственное, что я в параметре flags передаю 0.

но он все равно ничего не читает :\
...
Рейтинг: 0 / 0
Serial Port
    #38680184
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4erчто я здесь сделал не так, что он мне при чтении всегда возвращает "-1"???Как минимум, получение потока ввода-вывода внутри цикла - странная идея.
Далее, согласно Java SE API , "минус один" возвращается, когда система ввода вывода диагностирует состояние "нечего читать".
Это состояние, в свою очередь, возникает в двух случаях:
1. Достигнут конец файлов при блокирующем вводе-выводе;
2. Нечего читать при неблокирующем вводе-выводе.
У вас, вероятно - вторая ситуация.
Соответственно, выход из цикла чтения должен делаться не "по минус один", а по получению "осмысленного пакета данных" или по (вашему) условию "кончай работу".
Плюс, чтобы не вешать систему постоянным опросом com-порта, рекомендуется вставлять Thread.yield() внутри цикла.
...
Рейтинг: 0 / 0
Serial Port
    #38680488
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov2. Нечего читать при неблокирующем вводе-выводе.
Здесь блокирующий, поток чтения всегда висит на строке
Код: java
1.
size = mInputStream.read(buffer);

если нечего читать. Другое дело, что ТС хочет создать свои грабли, чужие рабочие ему как-то не по душе. :)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    private class ReadThread extends Thread {

        @Override
        public void run() {
            super.run();
            while(!isInterrupted()) {
                int size;
                try {
                    byte[] buffer = new byte[64];
                    if (mInputStream == null) return;
                    size = mInputStream.read(buffer);
                    if (size > 0) {
                        onDataReceived(buffer, size);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    return;
                }
            }
        }
    }
...
Рейтинг: 0 / 0
Serial Port
    #38680548
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

разобрался.. проблема где то на аппаратном уровне, или в настройках адресов SerialPort-a. На скорости 115200 устройство данные получает, но они совсем не понятные .. :\

-------
Пересылаю:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TfrmMain.btnWriteClick(Sender: TObject);
var
  Buf: array[0..2] of byte;
begin
  buf[0]:=5;
  buf[1]:=0;
  buf[2]:=7;
  SendStream(CommPort,length(buf),@Buf[0]);
end;


А в ответ приходит:
Скрин


Но это так понимаю не правильное определение формата данных..
А вот со скоростями мне не понятно.. :\ Буду терроризировать тех. поддержку...
...
Рейтинг: 0 / 0
Serial Port
    #38680589
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4erНо это так понимаю не правильное определение формата данных..
А вот со скоростями мне не понятно.. :\ Буду терроризировать тех. поддержку...

Порылся в интернете, и наткнулся на некое мнение, что проблема скоростей может заключается в том, что я под архитектурой ARM, пытаюсь работать с RS232 (Serial Port) библиотеками написанными под i386.

Как можно это проверить, кто знает?
...
Рейтинг: 0 / 0
Serial Port
    #38680610
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4erКак можно это проверить, кто знает?
Я-бы сказал, что это бред. :)
Но если очень хочется, то в папке примеров в ндк есть проект hello-jni, перетащи его значимую часть в SerialPort в отдельную функцию и узнаешь, какая именно цепляется библиотека.
...
Рейтинг: 0 / 0
Serial Port
    #38680670
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

я к тому, что изначально ведь андроид не подразумевал использование Serial Port. И они не переписывали(дописывали) в ядре средства обращения и конфигурации портов под ARM системы... Может там на прямую через ASM нужно ... ?

Я поигрался с настройками скорости и получил результат:

Свыше 19200 он не пишет корректные данные.
Ниже 57600 он не получает данные(пишет "буфер пустой")
...
Рейтинг: 0 / 0
Serial Port
    #38680688
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4erя к тому, что изначально ведь андроид не подразумевал использование Serial Port.
Это линукс, слегка порезанный. Он полноценно работает с портами, но из ядра вырезана часть поддерживаемых устройств. К примеру, cp210x, на большом линуксе в ядре имеется, а в андроиде - нет.
BoJI4erМожет там на прямую через ASM нужно ... ?
Интересно, а как у меня получается работать? :)
...
Рейтинг: 0 / 0
Serial Port
    #38680729
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman...Интересно, а как у меня получается работать? :)
Ты смог добраться до андроида с com портом и проверить? ... значит проблема заключается конкретно в моём устройстве. Учитывая то что там SU был порезанный до "невменяемости" .. может они и с серийниками что-то накосячили...
...
Рейтинг: 0 / 0
Serial Port
    #38680742
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4erТы смог добраться до андроида с com портом и проверить?
Я убедился, что он рабочий и собственно на этом и расстался с железкой. Сейчас хватает андроидной-виртуалки. Как и в случаем с cp210x через usb.
BoJI4erможет они и с серийниками что-то накосячили...
Мне было-бы просто в этом убедиться: у нас осциллограф имеется.
...
Рейтинг: 0 / 0
Serial Port
    #38680747
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

хэх.. кстати я о нем что-то не подумал ))) ... сейчас буду электронщиков терроризировать)
...
Рейтинг: 0 / 0
Serial Port
    #38684381
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Можешь напомнить, какая версия Android стоит на твоём планшете..?
...
Рейтинг: 0 / 0
Serial Port
    #38684390
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4er, там где serial port работал, что-то архаичное было, в районе 2.3.х. Рутованное, потому не исключаю, что доустановили от себя. Где usb serial - 4.1.х, но эта либа с usb будет работать на любом устройстве с usb-host и андроидом от 3.1.х.

Так что если на твоей железяке есть usb, посмотри в сторону usb serial и переходника usb->rs.
...
Рейтинг: 0 / 0
Serial Port
    #38684416
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

На железе есть USB, но строить кучу мостов из-за недоработки устройства плохая затея.
Я уверен на 100% что проблема в ОС. Потому что, после того как я(по совету производителя) обновил ОС прошивку до последней версии то все вообще перестало отправляться и приниматься. Когда вернул обратно то данные отправлялись и принимались (правда со старой ошибкой).

Я подключил переходник USB-> COM.
---------терминал--------[ 905.029663] usb 1-1.1: new full-speed USB device number 7 using musb-hdrc
[ 905.156188] usb 1-1.1: New USB device found, idVendor=0403, idProduct=6001
[ 905.163482] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 905.171173] usb 1-1.1: Product: USB Serial Converter
[ 905.176391] usb 1-1.1: Manufacturer: FTDI
[ 905.180633] usb 1-1.1: SerialNumber: FTAJUS95
---------------------
...
---------------
root@android:/dev # dmesg | grep USB
...
<3>[ 895.589752] hub 1-1:1.0: unable to enumerate USB device on port 2
<6>[ 905.029663] usb 1-1.1: new full-speed USB device number 7 using musb-hdrc
<6>[ 905.156188] usb 1-1.1: New USB device found, idVendor=0403, idProduct=6001
<6>[ 905.163482] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
<6>[ 905.171173] usb 1-1.1: Product: USB Serial Converter
---------------
Можешь подсказать, как мне с ним работать? :-)
---------терминал--------
130|root@android:/dev # dmesg | grep tty
<5>[ 0.000000] Kernel command line: console=ttyO0,115200n8 androidboot.console=ttyO0 root=ubi0:rootfs rw ubi.mtd=7,2048 init=/init rootfstype=ubifs rootwait=1
<6>[ 0.452545] omap_uart.0: ttyO0 at MMIO 0x44e09000 (irq = 72) is a OMAP UART0
<6>[ 1.198211] console [ttyO0] enabled
<6>[ 1.202392] omap_uart.1: ttyO1 at MMIO 0x48022000 (irq = 73) is a OMAP UART1
<6>[ 1.210113] omap_uart.2: ttyO2 at MMIO 0x48024000 (irq = 74) is a OMAP UART2
<6>[ 1.217773] omap_uart.3: ttyO3 at MMIO 0x481a6000 (irq = 44) is a OMAP UART3
<6>[ 1.225433] omap_uart.4: ttyO4 at MMIO 0x481a8000 (irq = 45) is a OMAP UART4
<6>[ 1.233093] omap_uart.5: ttyO5 at MMIO 0x481aa000 (irq = 46) is a OMAP UART5
<6>[ 1.282928] (hci_tty): inside hci_tty_init
<6>[ 1.287567] (hci_tty): allocated 251, 0
----------
...
Рейтинг: 0 / 0
Serial Port
    #38684433
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4erЯ уверен на 100% что проблема в ОС.
Предлагаю вещи называть своими именами: производители железяки взяли исходники андроида и даже умудрились его запустить. Но о полноценной работе ОС на железяке не беспокоятся.

BoJI4erМожешь подсказать, как мне с ним работать? :-)
Ну дак usb serial library:
Код: xml
1.
2.
<!-- 0x0403 / 0x6001: FTDI FT232R UART -->
    <usb-device vendor-id="1027" product-id="24577" />


Должен поддерживать.
...
Рейтинг: 0 / 0
Serial Port
    #38684442
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanBoJI4erЯ уверен на 100% что проблема в ОС.
Предлагаю вещи называть своими именами: производители железяки взяли исходники андроида и даже умудрились его запустить. Но о полноценной работе ОС на железяке не беспокоятся. Ну по вопросу производителя я еще не уверен, я общаюсь с их российским представительством...

wadmanBoJI4erМожешь подсказать, как мне с ним работать? :-)
Ну дак usb serial library:
Код: xml
1.
2.
<!-- 0x0403 / 0x6001: FTDI FT232R UART -->
    <usb-device vendor-id="1027" product-id="24577" />


Должен поддерживать.

Точно.. что-то я этот момент упустил :-)... сейчас попробую проверить...
...
Рейтинг: 0 / 0
Serial Port
    #38684460
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4erНу по вопросу производителя я еще не уверен, я общаюсь с их российским представительством...
В чем могут быть сомнения, что производитель не доработал вопрос согласованности своей железки со "своим" ПО?

К примеру: http://www.silabs.com/Support Documents/TechnicalDocs/an809.pdf эта штука уже давно интегрирована в ядро линукса, но в андроиде она вырезана. И чтоб её вернуть, необходимо пересобрать ядро под конкретную железку/смартфон. Это же касается, скорее всего, и твоей железки.

PDFAndroid is based off of the Linux kernel, so there is already support for the CP210x device built in to the kernel.
However, CP210x support is not included in a default kernel build configuration for most Android devices.
There are many devices that can run the Android operating system (OS), as well as several different versions of an
Android operating system. Because Android is open source, it can be changed based on the needs of device
manufacturers, wireless carriers and other developers. This fact makes it difficult to provide the exact steps for
rebuilding, as each developer may be using different hardware and a different build of Android specific to that
hardware.
...
Рейтинг: 0 / 0
Serial Port
    #38684552
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Появился еще один из вариантов, из-за которого может некорректно работать получение/отправка данных.
На устройстве включены (RTS и CTS сигналы). Закорочены они или нет я не знаю... возможно из-за них и не передаются данные...

Но вот только я не могу найти, как их включить на ПК (делфи).
...
Рейтинг: 0 / 0
Serial Port
    #38684570
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давно-бы уже взял готовую библиотеку для работы с ком-портами. Их, как грязи...

http://msdn.microsoft.com/en-us/library/windows/desktop/aa363254(v=vs.85).aspx

Если-бы посмотрел осциллографом, то давно-бы уже определил виновника.
...
Рейтинг: 0 / 0
Serial Port
    #38684636
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

осциллографом смотрели. Из устройства данные не идут... никаких. Из ПК сигнал проскакивает...
...
Рейтинг: 0 / 0
Serial Port
    #38684776
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4erНа устройстве включены (RTS и CTS сигналы). Закорочены они или нет я не знаю... возможно из-за них и не передаются данные...

Но вот только я не могу найти, как их включить на ПК (делфи).
Код: plaintext
1.
2.
3.
4.
mode /?
Последовательный порт:   MODE COMm[:] [BAUD=b] [PARITY=p] [DATA=d] [STOP=s]
                                      [to=on|off] [xon=on|off] [odsr=on|off]
                                      [octs=on|off] [dtr=on|off|hs]
                                      [rts=on|off|hs|tg] [idsr=on|off]

Может у вас кабель и управление потоком не соответствуют друг другу?
...
Рейтинг: 0 / 0
Serial Port
    #38684802
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovМожет у вас кабель и управление потоком не соответствуют друг другу?

Дело не в кабеле. (прочитай всю тему) проблема конкретно в устройстве... и похоже на уровне адресного пере направления (так как BIOS здесь нет, тут напрямую через ASM приписаны адреса в прошивке)
...
Рейтинг: 0 / 0
Serial Port
    #38684805
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4er, разработчики как-то объясняют такую фичеобразность работы с UART на их платформе?
...
Рейтинг: 0 / 0
Serial Port
    #38684900
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

представители написали "литература вам в помощь" (на вопрос работы под линуксом) а про андроид сказали "у нас клиенты не работают по схеме андроид+ rs232"


вот ответ на мой запрос:

Возможные причины:
* некорректная работа с сигналами управления RTS, DTR, CTS на стороне вашей программы на модуле и/или на стороне приемника (ПК)
* данные пришли, но забуферизированы в драйвере Windows или вашей программе-терминале. Были показаны вам возможно после того, как мигнул уровень RTS при перезагрузке после обновления.
* некорректно работающая программа-терминал на стороне Windows. Можно попробовать отключить управление сигналами передачи в настройках этой программы.


Сигнала с устройства нет вообще. На сколько я знаю "RTS/CTS" сигналы отключаются с помощью " cfg.c_cflag |= CRTSCTS ", верно?
...
Рейтинг: 0 / 0
Serial Port
    #38684911
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4erвот ответ на мой запрос:
Феерично. Причина в чем угодно, кроме их поделия. :)
BoJI4erНа сколько я знаю "RTS/CTS" сигналы отключаются с помощью " cfg.c_cflag |= CRTSCTS ", верно?
Ссылку-то я уже давал, это включение "or". Выключение "and not":
Код: plaintext
1.
options.c_cflags &= ~CNEW_RTSCTS;



Еще раз: http://ulisse.elettra.trieste.it/services/doc/serial/config.html
...
Рейтинг: 0 / 0
Serial Port
    #38684936
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanBoJI4erвот ответ на мой запрос:
Феерично. Причина в чем угодно, кроме их поделия. :)
BoJI4erНа сколько я знаю "RTS/CTS" сигналы отключаются с помощью " cfg.c_cflag |= CRTSCTS ", верно?
Ссылку-то я уже давал, это включение "or". Выключение "and not":
Код: plaintext
1.
options.c_cflags &= ~CNEW_RTSCTS;



Еще раз: http://ulisse.elettra.trieste.it/services/doc/serial/config.html

CNEW_RTSCTS не определяется у меня, а CRTSCTS определяется... я где то в ресурсах вычитывал что это одно и то же... :\
...
Рейтинг: 0 / 0
Serial Port
    #38684949
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почти
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#ifndef CRTSCTS
#  ifdef CNEW_RTSCTS
#    define CRTSCTS CNEW_RTSCTS
#  else
#    define CRTSCTS 0
#  endif /* CNEW_RTSCTS */
#endif /* !CRTSCTS */
...
Рейтинг: 0 / 0
Serial Port
    #38684982
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanПочти
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#ifndef CRTSCTS
#  ifdef CNEW_RTSCTS
#    define CRTSCTS CNEW_RTSCTS
#  else
#    define CRTSCTS 0
#  endif /* CNEW_RTSCTS */
#endif /* !CRTSCTS */



то есть по факту я вообще не могу его изменить...? раз у меня константа не определяется...
...
Рейтинг: 0 / 0
Serial Port
    #38684990
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4er, я думал ты понимаешь код. :) да, они равны.
...
Рейтинг: 0 / 0
Serial Port
    #38685026
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanBoJI4er, я думал ты понимаешь код. :) да, они равны.

что в коде написано я понимаю, просто значение константы "CNEW_RTSCTS" мне до сих пор было не известно...

По поводу устройства я к чему пришел.

по факту у меня 6 UART.

UART[0..5]

UART[0] - DebugUART выведен отдельными ножками, используется как терминальное(консоль) подключение.

UART[1] - визуально выведен RS232.

UART[2..5] - не выведенные оно инициализированные порты.

В порт UART[0] если не учитывать "консольный мусор" данные корректно отправляются и принимаются на любой скорости, в любом направлении.
В порт UART[1] ... все по старому :-) "ни туда ни сюда"...

скорее всего это проблема устройства... Написал это разработчикам - пусть мучаются...
...
Рейтинг: 0 / 0
Serial Port
    #38685156
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoJI4erДело не в кабеле. (прочитай всю тему)Я прочитал. В частности, про приколы со скоростями.
Возникает вопрос: если вы соединяете нуль-модемом два ПК - ваш код работает корректно? На всех скоростях и режимах управления потоком данных?
...
Рейтинг: 0 / 0
Serial Port
    #38685448
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovBoJI4erДело не в кабеле. (прочитай всю тему)Я прочитал. В частности, про приколы со скоростями.
Возникает вопрос: если вы соединяете нуль-модемом два ПК - ваш код работает корректно? На всех скоростях и режимах управления потоком данных?

да.. Работал нормально. Насчет режимов я не смотрел, меня интересует только 8N1, а скорости менял... в диапазоне 9600-115200
...
Рейтинг: 0 / 0
Serial Port
    #38685482
BoJI4er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проблема была явно в порте.. я думаю в материнской плате самого устройства, потому что
BoJI4erВ порт UART[0](DebugUART) если не учитывать "консольный мусор" данные корректно отправляются и принимаются на любой скорости, в любом направлении.
...
Рейтинг: 0 / 0
57 сообщений из 57, показаны все 3 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Serial Port
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]