powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Serial Port
25 сообщений из 57, страница 1 из 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
25 сообщений из 57, страница 1 из 3
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Serial Port
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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